Pasar diferentes parameters a una IBAction

Mi aplicación de iPhone tiene muchos botones y quiero que todos los botones llamen al mismo método, pero con diferentes parameters.

Por ejemplo, quiero tocar un button para llamar al método myMethod: con el argumento @"foo" , y un segundo button debería llamar al mismo método pero con argumento @"bar" .

Las llamadas "IBActions" deben tener una de estas firmas:

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

No puede agregar otros parameters. Sin embargo, puede usar el sender (que es button1 o button2 en su caso) para get el parámetro:

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

la verdadera razón por la que no puede agregar parameters adicionales es que UIKIT enviará parameters en la stack. entonces la única forma es usar tags. Una forma DIRTY puede ser convertir un puntero a int y labelr el button 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: los parameters DEBEN mantenerse en estática … o asignarse usando malloc (código cada vez más feo …). NO use una variable local: se asignará en la stack, por lo que se eliminará después de salir del método de configuration.

Entregue a sus diferentes instancias UIButton valores de propiedad de tag diferentes.

En su método -myMethod: puede 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 una enum si quiere que esto sea fácil de mantener.

No puede pasar parameters a través de una IBAction. Lo que suelo hacer es darle a los botones la label única en IB. La label es un valor integer, entonces yo uso una tabla de búsqueda simple para convertir la label en algún valor.

En este caso, tres botones, pero las tags 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]); } } 

(id) El remitente muestra que todo lo que pase en uibutton click evento es pasar directamente a este método y no importa qué tipo es, toma automáticamente como si pasas la label del button, entonces toma la label del button como remitente.tag, etc.

Como otros han mencionado, no puede pasar su parámetro personalizado al método de acción. Si no le agrada la solución con tags, también puede subclass UIButton con su class personalizada y agregue su parámetro allí. (Por no me molestaría y simplemente uso tags)

No lo haces. El único parámetro es el object emisor, que puede usar para tener un comportamiento diferente, pero lo que haría es definir 2 methods de acción, que a su vez denominan el mismo método con un parámetro diferente, es decir, tendría:

 - (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 juego de palabras), agregaría que es más claro cuando revisas tu interfaz de usuario con Interface Builder para ver que los diferentes botones tienen efectos diferentes, lo que es más difícil de saber si todos llaman a cualquierAcción: