这是我的代码:
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。
编译器给出了这个建议:
但是当使用它时,它会发出另一个编译警告:
我试过这个并没有得到编译错误,但是,我怀疑它是正确的解决方案。我不想在我的协议中添加@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)
}
}
答案 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.
}
}
而不会出现错误或警告。