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:"
符号。
故障排除 :如果你有NSTimer
select器的麻烦,也许你的类应该是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" }