UIButton remove all target-actions
IosUibuttonIos Problem Overview
I have added multiple target-action-forControlEvents: to a UIButton. I'd like to remove all of these in one go without deallocating anything. I will then set new targets.
Is this possible and how do I go about it?
Ios Solutions
Solution 1 - Ios
Call removeTarget:action:forControlEvents:, pass nil for the target, NULL for action, and use a control mask that sets all bits (UIControlEventAllEvents).
Objective-C
[someControl removeTarget:nil
action:NULL
forControlEvents:UIControlEventAllEvents];
Swift 2
button.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
Swift 3 or higher
button.removeTarget(nil, action: nil, for: .allEvents)
Solution 2 - Ios
@progrmr's answer in Swift 2:
button.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
and Swift 3:
button.removeTarget(nil, action: nil, for: .allEvents)
Note: Swift doesn't have NULL
, so I tested replacing it with nil
and it seems to work fine.
Solution 3 - Ios
Swift 3, 4, 5:
btnCancel.removeTarget(nil, action: nil, forControlEvents: UIControlEvents.AllEvents)
Solution 4 - Ios
Swift 2:
actionButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
Swift 3 & 4:
actionButton.removeTarget(nil, action: nil, for: .allEvents)
Objective-C:
[actionButton removeTarget: nil action: NULL forControlEvents: UIControlEventAllEvents];
Solution 5 - Ios
- removeTarget:action:forControlEvents:
This method stops the delivery of events to the specified target object.
-
Specifying a valid object in the target parameter, this method stops the delivery of the specified events to all action methods associated with that object.
-
Specifying nil for the target parameter, this method prevents the delivery of those events to all action methods of all target objects
objective-c:
[_myButton removeTarget: //any validObject (or) nil
action:nil
forControlEvents:UIControlEventAllEvents];
swift:
myButton.removeTarget(*validObject or nil*, action:nil, forControlEvents:UIControlEvents.AllEvents)
Solution 6 - Ios
you can change the selector if it is conditional. see below example
you can remove all the targets first, then choose the selector and add it.
rateButton.removeTarget(nil, action: nil, for: .allEvents)
let action = interview.isRated ? #selector(viewTapped(_:)) : #selector(rateTapped(_:))
rateButton.addTarget(self, action: action, for: .touchUpInside)