Swift:发送到实例的无法识别的选择器

为什么这不起作用:

self.backButton?.addTarget(self, action: Selector("backButtonPressed:"), forControlEvents: .TouchUpInside) // unrecognized selector sent to instance CRASH func backButtonPressed(sender:AnyObject?) { } 

此崩溃(发送到实例的无法识别的选择器)

  func backButtonPressed(sender:UIButton) { } 

如果我没有错,你已经在另一个方法中声明了你的backButtonPressed方法,如下所示:

 override func viewDidLoad() { super.viewDidLoad() let button = UIButton(frame: CGRectMake(150, 240, 75, 30)) button.setTitle("Next", forState: UIControlState.Normal) button.addTarget(self, action: Selector("backButtonPressed:"), forControlEvents: UIControlEvents.TouchUpInside) button.backgroundColor = UIColor.greenColor() self.view.addSubview(button) func backButtonPressed(sender:AnyObject?) { print("Called") } // Do any additional setup after loading the view, typically from a nib. } 

这是错误的方式。

在外部声明您的方法,如下面的代码所示:

 override func viewDidLoad() { super.viewDidLoad() let button = UIButton(frame: CGRectMake(150, 240, 75, 30)) button.setTitle("Next", forState: UIControlState.Normal) button.addTarget(self, action: Selector("backButtonPressed:"), forControlEvents: UIControlEvents.TouchUpInside) button.backgroundColor = UIColor.greenColor() self.view.addSubview(button) } func backButtonPressed(sender:AnyObject?) { print("Called") } 

在swift你不再需要写选择器了

 self.backButton?.addTarget(self, action: "backButtonPressed:", forControlEvents: .TouchUpInside) 

替换你的动作参数 – 选择器如:

 self.backButton?.addTarget(self, action: #selector(self. backButtonPressed(sender:)), for:. touchUpInside) 

Swift 3开始 ,选择器语法已经改变,如下所示。

对字符串文字使用选择器名称很容易出错:没有检查字符串是否是一个格式良好的选择器,更不用说它引用任何已知方法,或者是指目标类的方法。 此外,通过努力执行Objective-C API的自动重命名,Swift名称和Objective-C选择器之间的链接是不明显的。 通过提供基于方法的Swift名称的显式“创建选择器”语法,我们不需要开发人员推断使用的实际Objective-C选择器。