无法从自定义UIView调用按钮的方法

问题描述 投票:1回答:2

我想通过自定义视图内的按钮调用动作。视图本身是UIViewController的一部分。但是当我点击视图时,什么也没发生。尽管我的代码看起来像stackoverflow上的代码,但我不知道我的错误在哪里。

protocol StoreDelegate: class {
    func didPressButton(_ sender: UIButton)
}

class Store: UIView {

    weak var delegate:StoreDelegate?

    var button: UIButton = {
        let button = UIButton()
        button.setTitle("button", for: .normal)
        button.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        button.backgroundColor = .red
        button.addTarget(self, action: #selector(buttonPress(_:)), for: .touchUpInside)
        return button
    }()

    override init(frame: CGRect) {
        super.init(frame:frame)
        self.addSubview(button)
    }

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

   @objc func buttonPress(_ sender: UIButton) {
        delegate?.didPressButton(sender)
        print("here")
    }

}

这是我的ViewController:

class ViewController: UIViewController, StoreDelegate{

    var testView = Store()

    override func viewDidLoad() {
        super.viewDidLoad()
        testView.delegate = self
        self.view.addSubview(testView)
    }

    func didPressButton(_ sender: UIButton) {
        print("Hello")
    }
}

既不打印“ Hello”也不打印“ Here”。也许我误解了协议/代理模式。

ios swift uibutton delegates protocols
2个回答
2
投票

您需要为视图设置约束或框架

testView.frame = ///////

这是接收动作的基础


0
投票

您可以在sizeToFit类中实现覆盖Store以匹配您的需求:

override func sizeToFit() {
    frame.size = button.frame.size
}

然后您可以这样称呼:

testView.sizeToFit()

您可能会考虑使用自动布局以更好地调整大小。

© www.soinside.com 2019 - 2024. All rights reserved.