UIButton supprime toutes les actions cibles

341

J'ai ajouté plusieurs target-action-forControlEvents: à un UIButton. Je voudrais supprimer tout cela en une seule fois sans rien désallouer. Je fixerai alors de nouveaux objectifs.

Est-ce possible et comment procéder?

SK9
la source

Réponses:

824

Appelez removeTarget: action: forControlEvents:, passez nil pour la cible, NULL pour action et utilisez un masque de contrôle qui définit tous les bits (UIControlEventAllEvents).

Objectif c

[someControl removeTarget:nil 
                   action:NULL 
         forControlEvents:UIControlEventAllEvents];

Swift 2

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

Swift 3

button.removeTarget(nil, action: nil, for: .allEvents)
progrmr
la source
4
Merci pour le conseil! Voici le lien complet, je pense (c'est-à-dire vers la section): " developer.apple.com/iphone/library/documentation/uikit/… :"
SK9
1
La suggestion de progrmr fonctionne bien sûr. Pour ajouter à la réponse, voici un extrait de code comme celui dont j'avais besoin: [bouton removeTarget: nil action: NULL forControlEvents: UIControlEventTouchUpInside];
SK9
6
En plus: la méthode d'instance -allTargets retourne un NSSet de toutes les cibles de l'instance (nul si aucun).
SK9
3
Parfait! exactement ce que je cherchais: D
Totumus Maximus
1
Mis à jour avec Swift 2 et 3, car il existe des réponses concurrentes avec exactement la même réponse, ne différant que par la langue.
Peter DeWeese
92

Réponse de @ progrmr dans Swift 2:

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

et Swift 3:

button.removeTarget(nil, action: nil, for: .allEvents)

Remarque: Swift ne l'a pas NULL, j'ai donc testé le remplacer par nilet cela semble fonctionner correctement.

Hlung
la source
5
Pour Swift 3: ".AllEvents" est désormais ".allEvents" (avec un 'a' en minuscule):removeTarget(nil, action: nil, for: .allEvents)
Sasho
En ce qui concerne votre NOTE: En fait, je crois que vous pourriez passer soit nilou NULLà la fois les premier et deuxième arguments en Objective-C aussi, et cela fonctionnera. Je crois que les deux sont définis comme (void*) 0(ou à tout le moins, évalués comme égaux).
Nicolas Miari
@Sasho J'adorerais voir des statistiques sur la diminution de la taille des fichiers source (en moyenne) lors de la mise à niveau vers Swift 3 :-) (en raison des nouvelles règles de dénomination des méthodes / arguments).
Nicolas Miari
Comme il s'agit de la même réponse dans une langue différente et que la langue n'est pas balisée dans cette question, il devrait s'agir d'une modification de la réponse de @ progrmr.
Peter DeWeese
6

Rapide:

btnCancel.removeTarget(self, action: Selector(), forControlEvents: UIControlEvents.AllEvents)
Iya
la source
veuillez indiquer la langue que vous couvrez
Juan Boero
@ JuanPabloBoero, c'est rapide
Iya
3

Swift 2:

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

Swift 3 & 4:

actionButton.removeTarget(nil, action: nil, for: .allEvents)

Objectif c:

[actionButton removeTarget: nil action: NULL forControlEvents: UIControlEventAllEvents];

J'espère que ça aide.

Riajur Rahman
la source
2
- removeTarget:action:forControlEvents:

Cette méthode arrête la remise des événements à l'objet cible spécifié.

  1. En spécifiant un objet valide dans le paramètre cible, cette méthode arrête la livraison des événements spécifiés à toutes les méthodes d'action associées à cet objet.

  2. Spécifiant nil pour le paramètre cible, cette méthode empêche la livraison de ces événements à toutes les méthodes d'action de tous les objets cibles

    objectif c:

    [_myButton removeTarget:  //any validObject (or) nil
                  action:nil
        forControlEvents:UIControlEventAllEvents]; 
    

    rapide:

    myButton.removeTarget(*validObject or nil*, action:nil, forControlEvents:UIControlEvents.AllEvents)

Pour plus de détails https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/index.html#//apple_ref/occ/instm/UIControl/removeTarget:action:forControlEvents :

UdayM
la source