注意:我已经弄清楚了大部分内容-请参阅最后的更新。仍然有些混乱。
我正在尝试在Swift 3下的Xc8b6中实现NSUserActivity处理,并且遇到处理程序协议方法的方法签名有问题。
在当前文档中,该方法被称为:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
这与我在swift标头界面中看到的仅略有不同。在那里,restoreHandler中的返回类型是Swift.Void。
当我尝试这个时,我得到的错误是:
方法'application(_:continue:restorationHandler :)'提供的Objective-C方法'application:continue:restorationHandler:'与需求的选择器不匹配('application:continueUserActivity:restorationHandler:')
我意识到编译器警告现在还不太好,但是我认为这表示已经找到了Obj-C方法签名,但是我的参数不完全匹配。
我不确定还有其他地方。它匹配那里的东西-但什么是错的。随机猜测和检查对我没有帮助。
有趣的是,自动完成功能为我提供了不同的方法签名:
public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool
关于这一点的一件好事是它可以编译。不太好的事情是,当我从Spotlight中选择一个索引项目并点击以启动应用程序时,它不会被触发。
显然,我的NSUserAction正确识别了该应用程序并启动了它。有什么我可能会在这里丢失的东西,它不会触发restoreHandler吗?请注意,这是从在iOS 9下运行良好的项目转换而来的。
我还在WWDC视频中的“搜索的新功能”中看到了协议方法签名的另一个版本。我试过了,它编译了但没有触发。
只是为了解决问题,这是我在Swift 3转换工具完成后所拥有的签名。它已编译,但从聚光灯下启动时并未被触发:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool
- - 更新 - - -
好的。因此,上面提到的第一个方法签名是正确的。问题是我在AppDelegate的扩展中定义了它。在Swift 2.x中,此功能运行良好。
我已经把它移了,一切都很好。但是,我想更好地理解为什么从扩展中实现协议方法时会出现这些编译错误。它不再通过协议一致性进行携带吗?如果尝试将其添加到扩展名中,则会收到一条错误消息,指示它是重复项,因此我认为并非如此。
最初的问题是关于为什么未调用continueUserActivity(以及正确的签名是什么),因此我将在此处回答,以更清楚地说明出了什么问题。
正确的签名是我在帖子顶部放的:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
请记住,此签名与Xc8b6中自动完成功能所提供的签名不同,因此我怀疑其他人可能会这样做并从此响应中受益。
我最初的问题是它没有编译,因为我是在扩展中进行的。为了清楚起见:
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的扩展中编译。
我将其移至类范围,现在可以正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句