我这样创建了一个自定义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
的目标?? ...或者我的实现不正确吗?
谢谢!
答案 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)
您将目标添加到新创建的实例中,而不是添加到作为子视图添加的实例中,这是实现(计算属性)和闭包之间的主要区别