是否有可能在Swift中覆盖UIButton的动作方法?

时间:2016-07-04 14:06:06

标签: ios swift uibutton

我有一个UIButton。我想使用相同的UIButton来执行多个操作。首先,我以编程方式将操作设置为按钮。

button1.addTarget(self, action: #selector(ViewController.function1), forControlEvents: .TouchUpInside)

接下来,我想丢弃该功能,并希望添加其他操作。

button1.addTarget(self, action: #selector(ViewController.function2), forControlEvents: .TouchUpInside)

是否可以覆盖按钮的现有目标?

5 个答案:

答案 0 :(得分:6)

您建议的情况不会覆盖上一个操作,但会将第二个操作添加到该按钮,从而导致调用ViewController.function1ViewController.function2

在使用

添加新操作之前,您需要从目标中删除上一个操作

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents)

或者在添加新动作之前删除所有先前的操作

button1.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

答案 1 :(得分:4)

在添加新的操作之前,您需要从目标中删除上一个操作,否则会导致两个操作都触发

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents)

答案 2 :(得分:2)

我建议你创建一个包装函数。因为动态添加/删除目标可能导致死锁。

所以你可能必须创建一个总是被调用的函数,然后用你的东西来做:

@IBOutlet func myWrapper(sender : AnyObject?) {

 if (conditionA) {
  // do stuff A 
 } else {
  // do stuff B
 }
}

答案 3 :(得分:0)

在添加目标时,您可以使用按钮上的removeTarget方法将其删除:

func removeTarget(_ target: AnyObject?,
       action action: Selector,
 forControlEvents controlEvents: UIControlEvents)

编辑:有关使用示例,请参阅@Rohit KP的答案。但是,根据您的需要,您可能需要考虑使用其他“.AllEvents”。

答案 4 :(得分:0)

父代码:

@IBAction open func valueChanged(_ sender: UIButton) {
    (do something)
}

子代码:

override open func valueChanged(_ sender: UIButton) {
    super.valueChanged(sender)
    changeColorsOnState()
}