在Swift 3 / iOS 10中不能触发continueUserActivity

注意:我想到了大部分 – 在最后看到更新。 还是有些混乱。

我试图在Swift 3下在Xc8b6中实现NSUserActivity处理,并且遇到处理程序协议方法的方法签名问题。

在当前的文档中,该方法被认为是:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

这与我在swift头文件界面中看到的略有不同。 在那里,restorationHandler的返回types是Swift.Void。

当我尝试这个时,我得到的错误是:

Objective-C方法'application:continue:restorationHandler:'由方法'application(_:continue:restorationHandler :)'提供'与需求的select器('application:continueUserActivity:restorationHandler:')不匹配

我意识到编译器的警告现在不是很好,但我认为这是为它find了Obj-C方法签名,但是不知怎的,我的论点并不完全匹配。

我不知道还有什么可以去的。 它匹配那里 – 但有些错误。 随机猜测和检查还没有帮助我。

有趣的是,自动完成给了我一个不同的方法签名:

 public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool 

好的一点是它编译。 不太好的一点是,当我从Spotlight中select一个索引项目并点击它来启动应用程序时,它不会被触发。

很明显,我的NSUserAction正确识别了应用程序并启动了它。 有没有什么我可以在这里失踪的地方,它不会开火restorationHandler? 注意这是从iOS 9下运行正常的项目转换而来的。

我还在WWDCvideo中看到了有关search新function的协议方法签名的另一个版本。 我试过了,编译了但没有触发。

只是把事情弄清楚,这是Swift 3转换工具完成后的签名。 它编译,但从聚光灯启动时没有被触发:

 func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool 

—-更新—–

好。 所以上面提到的第一个方法签名是正确的。 问题是我在AppDelegate的扩展中定义它。 这在Swift 2.x中运行正常。

我把它搬起来,一切都很好。 但是我希望更好地理解为什么在从扩展实现协议方法时遇到这些编译错误。 它是否不再通过协议一致性? 如果我尝试将其添加到扩展中,则会显示一个错误,指示它是重复的,所以我不认为这是完全相同的。

原来的问题是关于为什么continueUserActivity没有被调用(以及什么是正确的签名),所以我会在这里回答一下,澄清出了什么问题。

正确的签名是我在我的post的顶部:

 func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

请记住,这个签名与Xc8b6中提供的自动完成function有什么不同,所以我怀疑其他人可能会遇到这种情况,并从这个响应中受益。

我原来的问题是,这不是编译,因为我是从一个扩展内部做的。 为了清楚:

 extension AppDelegate { func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { return true } } 

这可以在任何旧的iOS 9 / Swift 2.x项目中使用(使用较旧的continueUserActivity签名)。 我仍然不肯定为什么,但它不会在Xc8 / Swift 3中进行扩展编译。

我把它移到了类的范围,现在它工作正常。

所以,看起来像从Swift 3开始,协议方法只能在协议附加到类的范围内访问。

这意味着在协议UIApplicationDelegate中的所有AppDelegate方法只能在类AppDelegate中或者在符合UIApplicationDelegate的AppDelegate的扩展中访问

如果您尝试访问符合UIApplicationDelegate的类/扩展之外的UIApplicationDelegate方法,将无法进行编译。