UIButton elimina todas las acciones objetivo

341

He agregado múltiples target-action-forControlEvents: a un UIButton. Me gustaría eliminar todo esto de una vez sin desasignar nada. Luego estableceré nuevos objetivos.

¿Es esto posible y cómo lo hago?

SK9
fuente

Respuestas:

824

Llame a removeTarget: action: forControlEvents:, pase nil para el destino, NULL para la acción y use una máscara de control que establezca todos los bits (UIControlEventAllEvents).

C objetivo

[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)
programador
fuente
44
¡Gracias por el consejo! Aquí está el enlace completo, creo (es decir, a la sección): " developer.apple.com/iphone/library/documentation/uikit/… :"
SK9
1
La sugerencia del programa funciona, por supuesto. Para agregar a la respuesta aquí hay un fragmento de código como el que necesitaba: [button removeTarget: nil action: NULL forControlEvents: UIControlEventTouchUpInside];
SK9
66
Aparte: el método de instancia -allTargets devuelve un NSSet de todos los objetivos de la instancia (nulo si no hay ninguno).
SK9
3
¡Perfecto! exactamente lo que estaba buscando: D
Totumus Maximus
1
Actualizado con Swift 2 y 3, ya que hay respuestas competitivas con exactamente la misma respuesta, que difieren solo en el idioma.
Peter DeWeese
92

La respuesta de @progrmr en Swift 2:

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

y Swift 3:

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

Nota: Swift no tiene NULL, así que probé reemplazarlo nily parece funcionar bien.

Hlung
fuente
55
Para Swift 3: ".AllEvents" es ahora ".allEvents" (con una 'a' minúscula):removeTarget(nil, action: nil, for: .allEvents)
Sasho
En cuanto a su NOTA: En realidad, creo que podría pasar a cualquiera nilo NULLde ambas la primera y segunda argumentos en Objective-C también, y va a trabajar. Creo que ambos se definen como (void*) 0(o al menos, evaluar como iguales).
Nicolas Miari
@Sasho Me encantaría ver algunas estadísticas sobre cuánto bajan los tamaños de los archivos de origen (en promedio) al actualizar a Swift 3 :-) (debido a las nuevas reglas de nomenclatura de métodos / argumentos).
Nicolas Miari
Dado que esta es la misma respuesta en un idioma diferente, y el idioma no está etiquetado en esta pregunta, debería ser una edición de la respuesta de @progrmr.
Peter DeWeese
6

Rápido:

btnCancel.removeTarget(self, action: Selector(), forControlEvents: UIControlEvents.AllEvents)
Iya
fuente
indique qué idioma está cubriendo
Juan Boero
@ JuanPabloBoero, es rápido
Iya
3

Swift 2:

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

Swift 3 y 4:

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

C objetivo:

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

Espero eso ayude.

Riajur Rahman
fuente
2
- removeTarget:action:forControlEvents:

Este método detiene la entrega de eventos al objeto de destino especificado.

  1. Al especificar un objeto válido en el parámetro de destino, este método detiene la entrega de los eventos especificados a todos los métodos de acción asociados con ese objeto.

  2. Al especificar nil para el parámetro de destino, este método evita la entrega de esos eventos a todos los métodos de acción de todos los objetos de destino

    C objetivo:

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

    rápido:

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

Para más detalles https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/index.html#//apple_ref/occ/instm/UIControl/removeTarget:action:forControlEvents :

UdayM
fuente