Xcode 7.3 / Swift 2:“没有用Objective-Cselect器声明的方法”警告

我一直在使用select器,甚至在迁移到Swift之后,我可以毫无问题地使用它们。 这就是我在Swift 2上使用没有问题,直到我更新Xcode到版本7.3:

在这里输入图像说明

正如使用可以看到我使用NSTimer的select器。

这是所谓的行动:

func Start () { } 

正如你所看到的,Xcode 7.3现在给出了一个警告:“没有用Objective-Cselect器声明的方法”。 通过点击警告,Xcode通过添加“select器”来快速修复代码,但是我仍然得到相同的警告: 在这里输入图像说明

由于Swift 2.2 / Xcode 7.3有一个使用select器的新方法: Selector("funcName")被改为#selector(ClassName.funcName)

看看https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md

TL;博士;

#selector(YOUR_CLASS.Start)replaceSelector("Start") #selector(YOUR_CLASS.Start)

其中YOUR_CLASS =给定上下文中的目标类别。

如果您不想手动执行此操作,则Xcode默认情况下会自行修复,当您遇到以下情况时,请点击黄色三angular形(有时需要点击/多次点击),

在这里输入图像说明

它会给你build议: 在这里输入图像说明

如果你select了这个build议,它会自动更新select器: 在这里输入图像说明

下面的陈述完美地工作。 上面的一个主要是使用。 然而,当select器方法在不同的ViewController中时,编译器警告“可能会发生用Objective-Cselect器'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") } 

我自己支持文森特所说的一些发现(太长而不能成为一个直接的评论)

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

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

例如,如果在一个单独的文件中有一个扩展,尽pipe对于相同的视图控制器,这种格式的Selector("buttonHandler:")将不起作用。

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

#selector(MainViewController.buttonHandler(_:))

然而,这种格式只适用于select器在同一个VC +文件,如果它在一个单独的文件,但相同的VC,那么推荐的方法将无法正常工作,您需要使用该方法,而不需要构造

#selector(MainViewController.buttonHandler)

在Swift 4上,我必须在func之前添加@objc来摆脱警告。

这就是我所说的NSTimer的function:

  Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.intro), userInfo: nil, repeats: false) 

这是如何声明func:

  @objc func intro () { // do your stuff here } 

我也更新了Xcode所要求的设置:

在这里输入图像说明

没有更多的警告,一切似乎工作正常。