自从Swift 2.2 / Xcode 7.3,使用选择器的新方法:
Selector("funcName")
已更改为#selector(ClassName.funcName)
请参阅https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md
tl; dr;
将Selector("Start")
替换为#selector(YOUR_CLASS.Start)
其中YOUR_CLASS =上下文中目标类。
如果您不想手动操作,Xcode提供默认的易于修正工具,当您遇到以下情况时,请点击黄色三角形(有时需要多次点击)。
它会给您建议:
如果您选择该建议,它将自动更新选择器:
以下两个语句都能正常工作。通常使用第一个语句。但是,当选择器方法在不同的视图控制器中时,编译器会出现“没有声明Objective-C选择器'buttonHandler'”的警告。
第二个语句不会产生这个警告。
button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)
button.addTarget(parentViewController, action: #selector(MainViewController.buttonHandler), forControlEvents: .TouchUpInside)
func buttonHandler(sender:UIButton!) {
print ("Pressed")
}
我有一些自己的发现来支持Vincent所说的(太长了不能直接评论)
这不一定是在另一个视图控制器中,而是在一个不同的文件中,以下格式将无法使用:
button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)
例如,如果您在单独的文件中使用扩展,即使针对相同的视图控制器,这种格式Selector("buttonHandler:")
也无法工作。
此外,当选择器在同一文件和VC中时,Xcode的快速修复功能会提示您让选择器包括构造函数,因此它看起来像这样:
#selector(MainViewController.buttonHandler(_:))
然而,这种格式仅在选择器位于相同的VC +文件中时起作用。如果它位于单独的文件中但是在相同的VC中,则该推荐方法将无法工作,您需要使用不带构造函数的方法。
#selector(MainViewController.buttonHandler)
func Start
和YOUR_CLASS.Start
应该改为func start
和YOUR_CLASS.start
。 - Aaron Brager