iOS无法识别的select器发送到Swift中的实例

我有问题试图让用户按下它的UIButton工作。 我不断收到一个错误说:无法识别的select器发送到实例

override func viewDidLoad() { super.viewDidLoad() button.addTarget(self, action: "buttonClick", forControlEvents: UIControlEvents.TouchUpInside) button.setTitle("Print", forState: UIControlState.Normal) button.font = UIFont(name: "Avenir Next", size: 14) button.backgroundColor = UIColor.lightGrayColor() self.view.addSubview(button) } func buttonClick(Sender: UIButton!) { myLabelInfo.text = "Hello" } 

对于诸如func buttonClick(Sender: UIButton)的Swift方法,要传递给select器的addTarget方法的正确string是什么? 是“buttonClick”,“buttonClick:”,“buttonClickSender:”还是别的?

您正在为该操作使用无效的方法签名。 你提供的buttonClick ,但方法有一个参数,所以签名应该是buttonClick:

 button.addTarget(self, action: "buttonClick:", forControlEvents: UIControlEvents.TouchUpInside) 

有关如何格式化select器的更多信息,可以参考下面链接的post中接受的答案。 在这篇文章中使用的代码可能是Objective-C,但所有的教训也可以在这里应用。

使用参数从方法名称创buildselect器

另外,如果您使用Selector("buttonClicked:")作为动作,则此代码也是有效的,但您不必因为string文字可隐式转换为Selectortypes。

从Cocoa和Objective-C引用Swift

Objective-Cselect器是一种引用Objective-C方法名称的types。 在Swift中,Objective-Cselect器由Selector结构表示。 您可以使用string文字构造一个select器,比如let mySelector:Selector =“tappedButton:”。 由于string文字可以自动转换为select器,因此可以将string文字传递给接受select器的任何方法。

Swift <2.2

在Swift <2.2中,select器方法不能是private (无法识别的select器错误)。

首选(苹果)符号是string"methodWithParam:"符号。

故障排除 :如果你有NSTimerselect器的麻烦,也许你的类应该是NSObject一个子类。

Swift> = 2.2

使用#selector符号。 在这里阅读更多: https : //github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md

对于私有方法,您可以使用@objc方法修饰符,如下所示: @objc private func timerTick(timer: NSTimer)

不需要再NSObject的子类了!

Swift> 2.2的符号是:

 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(YourClass.yourMethod(_:))) 

为我工作到目前为止(Xcode 7.3)

你需要传递一个实际的Selector 。 尝试使用这一行代替:

 button.addTarget(self, action: Selector("buttonClick:"), forControlEvents: UIControlEvents.TouchUpInside) 

您还需要:在select器名称的末尾,因为您有1个参数。 这与典型的Obj-Cselect器命名相同。

在指定selector的时候,你错过了冒号,所以这行应该是

button.addTarget(self, action: Selector("buttonClick:"), forControlEvents: UIControlEvents.TouchUpInside)

我有同样的问题 – 解决scheme最终成为我希望button用@objc单击执行的方法的前缀,以便将其公开在Objective-C头文件中,从而在Objective-C运行库中公开。

喜欢:

 @objc func buttonClick(Sender: UIButton!) { myLabelInfo.text = "Hello" }