Swift 2.2 #selector用于委托/协议编译错误

时间:2016-03-31 15:16:44

标签: ios swift

这是我的代码:

protocol CustomControlDelegate: AnyObject {
    func buttonTapped(sender: AnyObject)
}

class CustomControl: UIView {
    var delegate: CustomControlDelegate? {
         didSet {
             aButton.addTarget(delegate, action: "buttonTapped:"), forControlEvents: UIControlEvents.TouchUpInside)
    }
}

从Swift 2.2开始,我收到编译错误,要求使用#selector。但在这种情况下,我无法弄清楚如何正确使用#selector。

编译器给出了这个建议:

enter image description here

但是当使用它时,它会发出另一个编译警告:

enter image description here

我试过这个并没有得到编译错误,但是,我怀疑它是正确的解决方案。我不想在我的协议中添加@objc

@objc protocol CustomControlDelegate: AnyObject {
    func buttonTapped(sender: AnyObject)
}

class CustomControl: UIView {
    var delegate: CustomControlDelegate? {
         didSet {
             aButton.addTarget(delegate, action: #selector(CustomControlDelegate.buttonTapped(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    }
}

1 个答案:

答案 0 :(得分:2)

我在这里没有看到避免var onLogoutTap = new TapGestureRecognizer(_ => MessagingCenter.Send(this, "Logout")); 的原因。该方法必须为@objc,以便Objective-C运行时调用它。您不能将@objc放到方法声明中,因此传达意图的唯一方法是制定协议@objc

@objc

虽然协议是@objc protocol CustomControlDelegate { func buttonTapped(sender: AnyObject) } ,但实现类不需要@objc - 只需使方法@objc可以使编译器满意。

@objc

然后您可以使用class MyControlDelegate: CustomControlDelegate { // ^ no `@objc`, not deriving NSObject @objc func buttonTapped(sender: AnyObject) { // ^ making just this method `@objc` is enough. } } 而不会出现错误或警告。