我想通过自定义视图内的按钮调用动作。视图本身是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”。也许我误解了协议/代理模式。
您需要为视图设置约束或框架
testView.frame = ///////
这是接收动作的基础
您可以在sizeToFit
类中实现覆盖Store
以匹配您的需求:
override func sizeToFit() {
frame.size = button.frame.size
}
然后您可以这样称呼:
testView.sizeToFit()
您可能会考虑使用自动布局以更好地调整大小。