我有一个视图,作为navigationController的子视图放置,以填充整个显示。在这个视图中,我有一个子视图,有两个按钮。 "删除和完成"。然后它还有一个日期选择器。但是,datePicker有效,“删除”和“完成”按钮不会触发动作功能。
按钮:
var setButton: UIButton = {
var button = UIButton(type: .system)
button.setTitle("Done", for: .normal)
button.tintColor = .white
button.addTarget(self, action: #selector(handleReminderSetBtn), for: .touchUpInside)
return button
}()
var cancelButton: UIButton = {
var button = UIButton(type: .system)
button.setTitle("Remove", for: .normal)
button.tintColor = .white
button.addTarget(self, action: #selector(handleReminderCancelBtn), for: .touchUpInside)
return button
}()
navigationController中的主要blackView:
viewOverLay.addSubview(cardreminder1)
viewOverLay.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height)
viewOverLay.backgroundColor = UIColor.black.withAlphaComponent(0.3)
self.navigationController?.view.addSubview(viewOverLay)
CardReminder1是UIView,我有两个按钮。
我认为两个按钮的addTarget方法中的目标存在一些问题。可能是什么问题?
答案 0 :(得分:1)
您不应该以这种方式初始化setButton
和cancelButton
。
从Setting a Default Property Value with a Closure or Function引用Apple文档:
如果使用闭包来初始化属性,请记住在执行闭包时尚未初始化实例的其余部分。这意味着您无法从闭包中访问任何其他属性值,即使这些属性具有默认值也是如此。 此外:
您也不能使用隐式自身属性,也不能调用任何实例的方法,因此问题就在这里:
addTarget(self...)
为了解决此问题,您应该在addTarget
完全初始化后移动按钮初始化(或移动CardReminder1
)。
答案 1 :(得分:0)
我有一个类似的问题。在我的案例中,连同发布的其他答案一样,使属性lazy
也起作用。这取决于您第一次尝试访问该属性的时间,但是在我的情况下,我仅在初始化完成后才访问它,因此使属性lazy
完美运行。
例如,在您的情况下,以下方法可能有效:
lazy var setButton: UIButton = {
var button = UIButton(type: .system)
button.setTitle("Done", for: .normal)
button.tintColor = .white
button.addTarget(self, action: #selector(handleReminderSetBtn), for: .touchUpInside)
return button
}()
lazy var cancelButton: UIButton = {
var button = UIButton(type: .system)
button.setTitle("Remove", for: .normal)
button.tintColor = .white
button.addTarget(self, action: #selector(handleReminderCancelBtn), for: .touchUpInside)
return button
}()