从Swift 2.2开始,以下代码给出了警告:
没有使用Objective-C selector'sync'
声明的方法
if let tabBarController = segue.destinationViewController as? TabBarController {
tabBarController.navigationItem.rightBarButtonItem =
UIBarButtonItem(title: "Upload",
style: .Plain,
target: tabBarController,
action: "sync")
我应该用action: "sync"
替换它以消除警告?
我试过了:
Selector("sync") // The Xcode provided fix which yields the same warning
#selector(tabBarController.sync()) // Error: Argument of '#selector' does not refer to initializer or method
Selector(tabBarController.sync()) // No error/warning but doesn't fire sync function
答案 0 :(得分:12)
首先在Swift2.2中阅读关于选择器的新documentation来解决您的问题。
实施例:
使用#selector(CLASS.sync)
代替Selector("sync")
。在CLASS中,它是包含此方法的实际类。
这是因为这个原因:
对选择器名称使用字符串文字是非常的 容易出错:没有检查字符串是否为a 格式良好的选择器,更不用说它指的是任何已知的方法,或者 预期类的方法。而且,努力表现 自动重命名Objective-C API,Swift名称之间的链接 而Objective-C选择器并不明显。通过提供明确的"创建 一个选择器"我们消除了基于方法的Swift名称的语法 开发人员需要推理实际的Objective-C 正在使用的选择器。
答案 1 :(得分:0)
我认为你错放了动作功能“sync”。将它保存在TabBarController中,因为您已将TabBarController的实例用作目标。像下面的代码将起作用:
tabBarController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Upload", style: .Plain, target: tabBarController, action: "sync:")
在TabBarController中保持以下功能:
func sync(sender: AnyObject){
//your code here
}
希望它能解决您的问题。 :)