Xcode 7.3 / Swift 2:"没有使用Objective-C选择器声明的方法"警告

时间:2016-03-22 16:31:57

标签: swift nstimer

我已经使用了一段时间的选择器,甚至在迁移到Swift之后我能够毫无问题地使用它们。这就是我在Swift 2上使用的方式没有问题,直到我将Xcode更新到版本7.3:

looking at the definition

正如使用可以看到我使用带有NSTimer的选择器。

这是被称为的行动:

{{1}}

正如您所见,Xcode 7.3现在发出警告"没有使用Objective-C选择器声明的方法"。通过单击警告,Xcode通过添加" Selector"快速修复代码,但我仍然收到相同的警告:enter image description here

4 个答案:

答案 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提供简单的修复,当你遇到以下情况时,点击黄色三角形(有时需要点击/点击多次),

enter image description here

它会给你建议: enter image description here

如果您选择该建议,它将自动更新选择器: enter image description here

答案 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要求更新了设置:

enter image description here

没有更多警告,一切似乎都正常。

答案 3 :(得分:0)

我自己的一些调查结果支持文森特所说的(太长时间不能直接评论)

它不一定在不同的视图控制器中,而只是一个不同的文件,其中以下格式不起作用:

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)

例如,如果您在单独的文件中有扩展名,但对于同一个视图控制器,此格式Selector("buttonHandler:")将无效。

此外,当选择器在同一个文件和VC中时,Xcode的快速修复会提示您让选择器包含构造函数,所以它看起来像这样: / p>

#selector(MainViewController.buttonHandler(_:))

然而此格式仅在选择器位于同一VC +文件中时才有效,如果它位于单独的文件中,但是VC相同,则该推荐方法不起作用,并且你需要使用没有构造函数的方法

#selector(MainViewController.buttonHandler)