我已经使用了一段时间的选择器,甚至在迁移到Swift之后我能够毫无问题地使用它们。这就是我在Swift 2上使用的方式没有问题,直到我将Xcode更新到版本7.3:
正如使用可以看到我使用带有NSTimer的选择器。
这是被称为的行动:
{{1}}
正如您所见,Xcode 7.3现在发出警告"没有使用Objective-C选择器声明的方法"。通过单击警告,Xcode通过添加" Selector"快速修复代码,但我仍然收到相同的警告:
答案 0 :(得分:87)
自Swift 2.2 / Xcode 7.3以来,有一种使用选择器的新方法:
Selector("Start")
已更改为#selector(YOUR_CLASS.Start)
查看https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md,
TL;博士;
将double rightBound = textBlock.Margin.Left + textBlock.ActualWidth;
替换为Point blockPoint = textBlock.TranslatePoint(new Point(0, 0), myMainWindow);
其中YOUR_CLASS =给定上下文中的目标类。
如果你不想手动操作,默认情况下Xcode提供简单的修复,当你遇到以下情况时,点击黄色三角形(有时需要点击/点击多次),
答案 1 :(得分:4)
以下两个陈述都完美无缺。上面的一个主要使用。但是当选择器方法在不同的ViewController中时,编译器警告"没有用Objective-C选择器声明的方法' buttonHandler'"可能会发生。
第二个列出的陈述没有给出这个警告。
button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)
button.addTarget(parentViewController, action: #selector(MainViewController.buttonHandler), forControlEvents: .TouchUpInside)
在目标视图控制器(MainViewController)中,您可以定义模块:
func buttonHandler(sender:UIButton!) {
print ("Pressed")
}
答案 2 :(得分:1)
在Swift 4上,我必须在func之前添加@objc以消除警告。
这就是我用NSTimer调用func的方式:
>
这就是声明func的方式:
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.intro), userInfo: nil, repeats: false)
我还按Xcode要求更新了设置:
没有更多警告,一切似乎都正常。
答案 3 :(得分:0)
我自己的一些调查结果支持文森特所说的(太长时间不能直接评论)
它不一定在不同的视图控制器中,而只是一个不同的文件,其中以下格式不起作用:
button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)
例如,如果您在单独的文件中有扩展名,但对于同一个视图控制器,此格式Selector("buttonHandler:")
将无效。
此外,当选择器是在同一个文件和VC中时,Xcode的快速修复会提示您让选择器包含构造函数,所以它看起来像这样: / p>
#selector(MainViewController.buttonHandler(_:))
然而此格式仅在选择器位于同一VC +文件中时才有效,如果它位于单独的文件中,但是VC相同,则该推荐方法不起作用,并且你需要使用没有构造函数的方法
#selector(MainViewController.buttonHandler)