引用方法的Objective-C选择器

时间:2016-03-25 03:17:00

标签: swift swift2.2

从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

2 个答案:

答案 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
}

希望它能解决您的问题。 :)