我在视图上有一个带有单个按钮的SomeViewController
。在didLoad
中,我通过以下方式从对象添加方法作为按钮触摸的处理程序:
class SomeViewController: UIViewController {
func didLoad() {
// ...
let x = X()
button.addTarget(self, action: #selector(x.test),
for: UIControl.Event.touchUpInside)
// ...
}
class X {
@objc func test(sender:UIButton) {
// ...
}
}
@objc func test(sender:UIButton) {
// ...
}
}
我是新手,没有使用Objective-C的经验。但是,当我检查名为SomeViewController.test
的按钮触摸时,破坏了我对编程语言的理解。对我来说,这似乎是一个错误。
删除SomeViewController.test
后,触摸按钮会导致异常:
2019-03-07 13:07:25.737090 + 0200 myProgram [13570:283951] -[myProgram.SomeViewController testWithSender:]:无法识别的选择器已发送到实例0x7fbcc9d174d0 2019-03-07
13:07:25.745918 + 0200 myProgram [13570:283951] ***由于以下原因终止了应用 未捕获的异常“ NSInvalidArgumentException”,原因: '-[myProgram.SomeViewController testWithSender:]:无法识别 选择器发送到实例0x7fbcc9d174d0'
使用包装器#selector
订阅事件的原理是什么?
如何将方法订阅到包含此方法的类之外的按钮触摸中?如果不可能,为什么?
迅速4.2
答案 0 :(得分:1)
替换
button.addTarget(self, action: #selector(x.test),
for: UIControl.Event.touchUpInside)
使用
button.addTarget(x, action: #selector(x.test),
for: UIControl.Event.touchUpInside)
由于目标应包含选择器方法的实现,因此最好制作
let x = X()
实例变量