Xcode 7.3 / Swift 2: “No method declared with Objective-C selector” warning

前提是你 提交于 2019-11-27 19:58:56

Since Swift 2.2 / Xcode 7.3 there is a new way to use a selector: Selector("funcName") was changed to #selector(ClassName.funcName)

Have a look at https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md ,

tl;dr;

Replace Selector("Start") with #selector(YOUR_CLASS.Start)

where YOUR_CLASS = class of target in given context.

If you don't want to do it manually, Xcode provides easy fix itself by default, when you have the following situation, tap on the Yellow triangles ( sometimes required to tap/click multiple times ),

it will give you suggestion:

And if you select that suggestion, it will automatically update the selector:

Both following statements work perfectly. The upper one is mostly used. However when the selector method is in a different ViewController the compiler warning "No method declared with Objective-C selector 'buttonHandler'" may occur.

The second listed statement does not give this warning.

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

button.addTarget(parentViewController, action: #selector(MainViewController.buttonHandler), forControlEvents: .TouchUpInside)

In the target view controller (MainViewController) you can define the module:

func buttonHandler(sender:UIButton!) {
    print ("Pressed")
}

On Swift 4 I had to add @objc before the func to get rid of the warnings.

This is how I call the func with NSTimer:

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

This is how the func is declared:

     @objc func intro () {

          // do your stuff here         

     }

I also updated the setting as the Xcode requested:

No more warnings, everything seems to be working fine.

Some findings of my own to support what Vincent said (too long to be a direct comment)

It's not necessarily in a different view controller, but just a different file where the following format won't work:

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

For instance, if you have an extension in a separate file, although for the same view controller, this format Selector("buttonHandler:") won't work.

Further, when the selector is in the same file and VC, Xcode's quick-fix prompts you to have the selector include the constructor, so it would look something like this:

#selector(MainViewController.buttonHandler(_:))

However this format only works when the selector is in the same VC + file, if it is in a separate file, but same VC, then that recommended method won't work, and you need to use the method without the constructor

#selector(MainViewController.buttonHandler)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!