我有一个UIButton
。我想使用相同的UIButton
来执行多个操作。首先,我以编程方式将操作设置为按钮。
button1.addTarget(self, action: #selector(ViewController.function1), forControlEvents: .TouchUpInside)
接下来,我想丢弃该功能,并希望添加其他操作。
button1.addTarget(self, action: #selector(ViewController.function2), forControlEvents: .TouchUpInside)
是否可以覆盖按钮的现有目标?
答案 0 :(得分:6)
您建议的情况不会覆盖上一个操作,但会将第二个操作添加到该按钮,从而导致调用ViewController.function1
和ViewController.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()
}