Estoy usando addTarget: action: forControlEvents como este:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
y me gustaría pasar parámetros a mi selector "switchToNewsDetails". Lo único que logro hacer es pasar al remitente (id) escribiendo:
action:@selector(switchToNewsDetails:)
Pero estoy tratando de pasar variables como valores enteros. Escribirlo de esta manera no funciona:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
Escribirlo de esta manera tampoco funciona:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Cualquier ayuda sería apreciada :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Pierre Espenan
fuente
fuente
Respuestas:
No pasa parámetros al
switchToNewsDetails:
método aquí. Simplemente cree un selector para que el botón pueda llamarlo cuando ocurra cierta acción (retoque en su caso). Los controles pueden usar 3 tipos de selectores para responder a las acciones, todos ellos tienen un significado predefinido de sus parámetros:sin parámetros
con 1 parámetro que indica el control que envía el mensaje
Con 2 parámetros que indican el control que envía el mensaje y el evento que activó el mensaje:
No está claro qué es exactamente lo que intenta hacer, pero teniendo en cuenta que desea asignar un índice de detalles específico a cada botón, puede hacer lo siguiente:
En el
switchToNewsDetails:
método puede obtener ese índice y abrir detalles apropiados:fuente
[button.layer setValue:yourObject forKey:@"anyKey"];
y luego, en el método, simplemente marque(objectClass *)[button.layer valueForKey:@"anyKey"];
Es como una versión más gratuita de.tag
Para pasar parámetros personalizados junto con el botón, solo necesita SUBCLASS UIButton .
(ASR está activado, por lo que no hay versiones en el código).
Este es myButton.h
Este es myButton.m
Uso:
Función de recepción:
Si necesita que sea más específico en cualquier parte del código anterior, no dude en preguntarlo en los comentarios.
fuente
tag
propiedad en las vistas de Android . Pueden almacenar cualquier objeto. Y también puede almacenar objetos por clave como en un Diccionario / Mapa.Target-Action permite tres formas diferentes de selector de acciones:
fuente
¿Necesita más que solo un (int) a través de .tag? Use KVC!
Puede pasar cualquier dato que desee a través del objeto de botón en sí (accediendo a CALayers keyValue dict).
Establezca su objetivo de esta manera (con el ":")
Agregue su (s) información (es) al botón en sí (así como
.layer
al botón que está) así:Luego, cuando se toca el botón, puede verificarlo así:
fuente
Hice una solución basada en parte en la información anterior. Simplemente configuré titlelabel.text en la cadena que quiero pasar y configuré titlelabel.hidden = YES
Me gusta esto :
De esta manera, no hay necesidad de una herencia o categoría y no hay pérdida de memoria
fuente
Estaba creando varios botones para cada número de teléfono en una matriz, por lo que cada botón necesitaba un número de teléfono diferente para llamar. Usé la función setTag mientras creaba varios botones dentro de un bucle for:
Luego, en mi llamada: método, utilicé el mismo for loop y una instrucción if para elegir el número de teléfono correcto:
fuente
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Como hay muchas formas mencionadas aquí para la solución, excepto la función de categoría.
Por ejemplo (ex):
en su vista Controlador.m
Controlador de eventos:
fuente
Puede reemplazar la acción del objetivo con un cierre (bloque en Objective-C) agregando un envoltorio de cierre auxiliar (ClosureSleeve) y agregándolo como un objeto asociado al control para que se retenga. De esa manera puede pasar cualquier parámetro.
Swift 3
Uso:
fuente
self.switchToNewsDetails(parameter: i)
) disparando 2 veces, ¿por qué ayudarme?button.addAction()
dos veces. Agregue un punto de interrupciónbutton.addAction
y también en la primera línea dentro del cierre e intente depurarlo usted mismo.Hay otra forma, en la que puede obtener indexPath de la celda donde se presionó el botón:
usando el selector de acción habitual como:
y luego en su función:
desde que obtienes indexPath se vuelve mucho más simple.
fuente
Vea mi comentario anterior, y creo que debe usar NSInvocation cuando hay más de un parámetro
Más información sobre NSInvocation aquí
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
fuente
Esto solucionó mi problema pero se bloqueó a menos que cambiara
a
fuente
Subclasifiqué UIButton en CustomButton y agregué una propiedad donde almaceno mis datos. Entonces llamo método: (CustomButton *) remitente y en el método solo leo mi data sender.myproperty.
Ejemplo de CustomButton:
Método de acción:
Asignar acción
fuente
Si solo desea cambiar el texto para el leftBarButtonItem que muestra el controlador de navegación junto con la nueva vista, puede cambiar el título de la vista actual justo antes de llamar a pushViewController al texto deseado y restaurarlo en la devolución de llamada viewHasDisappered para futuras presentaciones de La vista actual.
Este enfoque mantiene la funcionalidad (popViewController) y la apariencia de la flecha que se muestra intacta.
Al menos funciona para nosotros con iOS 12, construido con Xcode 10.1 ...
fuente