2010-01-22 10 views
12

Mi aplicación iPhone tiene muchos botones y quiero que todos los botones llamen al mismo método, pero con diferentes parámetros.Pase diferentes parámetros a un IBAction

Por ejemplo, quiero presionar un botón para llamar al método myMethod: con el argumento @"foo", y un segundo botón debe llamar al mismo método pero con el argumento @"bar".

Respuesta

27

Los llamados "IBActions" debe tener una de estas firmas:

-(void)action; 
-(void)actionWithSender:(id)sender; 
-(void)actionWithSender:(id)sender event:(UIEvent*)event; 

no puede agregar cualquier otro parámetro. Sin embargo puede utilizar sender (que es el botón 1 o button2 en su caso) para obtener el parámetro:

-(void)actionWithSender:(UIButton*)sender { 
    NSString* parameter; 
    if (sender.tag == 1) // button1 
    parameter = @"foo"; 
    else     // button2 
    parameter = @"bar"; 
    ... 
} 
+0

¡Perfecto! Exactamente la respuesta que estaba esperando. ¡Gracias! – Quentamia

1

Proporcione a sus varias instancias UIButton diferentes valores de la propiedad tag.

En su IBAction método -myMethod:, que podría entonces hacer algo como:

- (void) myMethod:(id)sender { 
    switch (sender.tag) { 
     case (firstButtonTag): 
      doFooStuff; 
      break; 
     case (secondButtonTag): 
      doBarStuff; 
      break; 
     // etc. 
    } 
} 

Los valores firstButtonTag y secondButtonTag se pueden almacenar en un enum si quieres hacer esto fácil de mantener.

1

No se puede pasar parámetros a través de un IBAction. Lo que suelo hacer es darle a los botones la etiqueta única en IB. La etiqueta es un valor entero, así que utilizo una tabla de búsqueda simple para convertir la etiqueta a algún valor.

En este caso, tres botones, pero las etiquetas 1 a 3:

- (IBAction) buttonPressed: (UIButton*) sender 
{ 
    static const NSString* names = { @"Foo", @"Bar", @"Baz" }; 
    id tag = [sender tag]; 
    if (tag >= 1 && tag <= 3) { 
     NSLog(@"Button pressed is %@", names[tag]); 
    } 
} 
-1

Usted no lo hace. El único parámetro es el objeto remitente, que puede usar para tener un comportamiento diferente, pero lo que haría sería definir 2 métodos de acción, que simplemente invocarían el mismo método con un parámetro diferente, es decir, tendrían:

- (IBAction)button1:(id)sender 
{ 
    [self doStuff:kButton1]; 
} 

- (IBAction)button2:(id)sender 
{ 
    [self doStuff:kButton2]; 
} 

- (void)doStuff:(ParamType)param; 
{ 
    ... 
} 

En defensa de ese método (sin doble sentido), me gustaría añadir que hace más clara cuando se revise la interfaz de usuario con Interface Builder para ver que los diferentes botones en realidad tienen diferentes efectos, que es más difícil saber si all call whateverAction:

0

Como han mencionado otros, no puede pasar su parámetro personalizado al método de acción. Si no te gusta la solución que usa etiquetas, también puedes subclavar UIButton con tu clase personalizada y agregar allí tu parámetro. (Por no me molestaría y solo uso etiquetas)

2

la verdadera razón No se puede agregar un parámetro adicional, es que UIKIT presionará params en la pila. así que la única forma es usar etiquetas. Una manera sucia puede ser para convertir un puntero a int y etiquetar el botón con él:

myStruct params; 
// fill params: 
params.x=.... 
params.y=.... 
params.z=.... 


UIButton * btn = [UIButton......]; // create or use one from XIB 
btn.tag = (int)&params; 

... in Call back: 
-(IBActions) doIt:(id)sender 
{ 
    myStruct * paramsPtr = (myStruct*)tag; 
    int i = paramsPtr->x; 

NOTA: params DEBEN mantener estática .. o asignar el uso de malloc (más y más código fea ...). NO use una var local: se asignará en la pila, por lo que se eliminará después de salir del método de configuración.

+0

Esa es una idea horrible, y recomendarla en un foro público también es una mala idea. –

1

(id) El remitente muestra que todo lo que pase en el evento de clic de UIButton pasa directamente a este método y no importa de qué tipo sea, toma automáticamente como si pasara una etiqueta de botón y luego la etiqueta de botón como remitente. etiqueta, etc.

Cuestiones relacionadas