Swift:View Controller触摸事件中的自定义UIButton类不会触发吗?

时间:2019-03-17 22:12:40

标签: ios swift uibutton

我这样创建了一个自定义UIButton类:

class CustomButton: UIButton
{
    required init(frame: CGRect, title: String, alignment: NSTextAlignment)
    {
        super.init(frame: frame)

        // Set properties

//        self.addTarget(self,
//                       action: #selector(touchCancel),
//                       for: .touchUpInside)
    }

    required init?(coder aDecoder: NSCoder)
    {
        fatalError("init(coder:) has not been implemented")
    }

//    @objc fileprivate func touchCancel()
//    {
//        print("TOUCHED")
//    }
}

在我的主要UIViewController中,我具有以下实现:

class MainViewController: UIViewController
{   
    fileprivate var customBtn: CustomButton {
        let frame = CGRect(x: 48.0,
                           y: 177.0,
                           width: 80.0,
                           height: 40.0)
        let custom = CustomButton(frame: frame,
                                  title: "Test",
                                  alignment: NSTextAlignment.right)
        return custom
    }

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.addSubView(customBtn)

        customBtn.addTarget(self,
                            action: #selector(touchCancel),
                            for: .touchUpInside)
    }

    @objc public func touchCancel()
    {
        print("TOUCHED")
    }
}

但是,不会触发在我的主customBtn中向UIViewController添加目标的情况。如带有注释代码的CustomButton类中所示,我可以在其中添加目标,确实会被触发。

我只是想知道为什么不能使用另一个类中的已定义函数作为自定义UIButton的目标?? ...或者我的实现不正确吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可能需要关闭而不是计算所得的属性

lazy var customBtn: CustomButton = {
    let frame = CGRect(x: 48.0, y: 177.0, width: 80.0, height: 40.0)
    let custom = CustomButton(frame: frame, title: "Test",alignment: NSTextAlignment.right)
    return custom
}()

MainViewController

customBtn.addTarget(self,
                        action: #selector(touchCancel),
                        for: .touchUpInside)

您将目标添加到新创建的实例中,而不是添加到作为子视图添加的实例中,这是实现(计算属性)和闭包之间的主要区别