首页 > 解决方案 > 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

任何想法可能会发生什么?谢谢!

标签: iosswiftdelegatesprotocols

解决方案


在按钮类中为按钮添加动作:

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函数作为选择器传递。


推荐阅读