UIButton选择器不起作用

时间:2018-01-13 12:21:38

标签: ios swift button uiview uinavigationcontroller

我有一个视图,作为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,我有两个按钮。

enter image description here

我认为两个按钮的addTarget方法中的目标存在一些问题。可能是什么问题?

2 个答案:

答案 0 :(得分:1)

您不应该以这种方式初始化setButtoncancelButton

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
}()