ios - Swift 4:以编程方式创建的按钮 addTarget 在委托类中崩溃
问题描述
我创建了一个委托协议,该协议创建一个 UIButton 并将其添加到父视图中。
protocol ButtonInputFactoryDelegate {
func buttonAction(in formFactory: SubmitInputFactory)
}
在委托类中,我有两种方法,一种用于创建按钮,另一种用于实现委托的按钮操作。
class myButtonClass {
(...)
func setupButton() {
guard let delegate = self.delegate else { return }
// Button creation and setup
submitButton.addTarget(self.parentViewController, action: #selector(internalButtonAction(_:)), for: .touchUpInside)
self.parentViewController.view.addSubview(submitButton)
}
@objc func internalButtonAction(_ sender: UIButton) {
guard let delegate = self.delegate else { return }
delegate.buttonAction(in: self)
}
}
在 viewController 我有以下
class TestViewController: UIViewController, ButtonInputFactoryDelegate {
override func viewDidLoad() {
(...)
myButtonClass.delegate = self
myButtonClass.setupButton()
}
func buttonAction(in formFactory: SubmitInputFactory) {
print("Test")
}
}
然后当点击按钮时,它应该被调用internalButtonAction
并在里面执行delegate.buttonAction
Xcode编译它没有错误,但是当点击按钮时出现以下错误
(...) unrecognized selector sent to instance 0x102139200
任何想法可能会发生什么?谢谢!
解决方案
在按钮类中为按钮添加动作:
class MyButtonClass {
var submitButton: UIButton = UIButton()
(...)
func setSubmitAction(_ target: Any, action: Selector) {
self.submitButton.addTarget(target, action: action, for: .touchUpInside)
}
}
在 ViewController 上使用它时,它必须是这样的:
myButtonClassInstance().setSubmitAction(self, action: #selector(self.submitButtonAction(_:)))
使用 ViewController 中定义的操作,例如:
@objc func submitButtonAction(_ sender: UIButton) {
print("Test")
}
需要将@objc
函数作为选择器传递。
推荐阅读
- logback - micronaut 可以使用 logback 记录访问日志吗?
- java - 无法从 OnTimeSetListener 调用字符串
- tfs - 构建步骤上的简单自定义条件不适用于 TFS
- eclipse - 我的断点不适用于 Eclipse Mars 2
- r - Mac OS 闪亮的可执行文件
- angular - 在库模块中使用 config (forRoot) 加载第三方模块
- asp.net-mvc - 单选按钮的选中属性未绑定到模型的布尔属性
- sql-server - 使用大小写时的不同计数
- python - 本地与 pip 安装的 python 代码的工作方式不同
- php - 特殊数组中的PHP foreach