2010-01-22 7 views
12

Mon application iPhone comporte de nombreux boutons et je souhaite que tous les boutons appellent la même méthode, mais avec des paramètres différents.Transmettre différents paramètres à un IBAction

Par exemple, je veux appuyer sur un bouton pour appeler la méthode myMethod: avec l'argument @"foo", et un second bouton devrait appeler la même méthode mais avec l'argument @"bar".

Répondre

27

Le soi-disant « IBActions » doit avoir une de ces signatures:

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

Vous ne pouvez pas ajouter d'autres paramètres. Néanmoins, vous pouvez utiliser sender (qui est button1 ou Bouton2 dans votre cas) pour obtenir le paramètre:

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

Parfait! Exactement la réponse que j'espérais. Merci! – Quentamia

1

Donnez à vos différentes instances UIButton différentes valeurs de propriété tag.

Dans votre méthode IBAction-myMethod:, vous pourriez faire quelque chose comme:

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

Les valeurs firstButtonTag et secondButtonTag peuvent être stockés dans un enum si vous voulez faire de ce facile à entretenir.

1

Vous ne pouvez pas passer des paramètres par un IBAction. Ce que je fais habituellement est de donner aux boutons l'étiquette unique dans IB. La balise est une valeur entière, donc j'utilise une simple table de conversion pour convertir la balise en valeur.

Dans ce cas, trois boutons mais balises 1 à 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

Vous n'avez pas. Le seul paramètre est l'objet émetteur, que vous pouvez utiliser pour avoir un comportement différent, mais ce que je ferais est de définir 2 méthodes d'action, qui à leur tour appellent la même méthode avec un paramètre différent, à savoir:

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

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

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

Dans la défense de cette méthode (sans jeu de mots), j'ajouter que cela fait plus clair lorsque vous passez en revue votre interface avec Interface Builder pour voir que les différents boutons ont effectivement des effets différents, ce qui est plus difficile de dire si elles tous appeler quelquechoseAction:

0

Comme d'autres l'ont mentionné, vous ne pouvez pas passer votre paramètre personnalisé dans la méthode d'action. Si vous n'aimez pas la solution utilisant des balises, vous pouvez également sous-classer UIButton avec votre classe personnalisée et y ajouter votre paramètre. (Par je ne voudrais pas déranger et juste utiliser des étiquettes)

2

la vraie raison Vous ne pouvez pas ajouter de paramètre supplémentaire est que UIKIT poussera params sur la pile. donc le seul moyen est d'utiliser des tags. Une façon DIRTY peut être de convertir un pointeur vers int et le marquage sur le bouton avec elle:

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; 

REMARQUE: params DOIVENT être garder statique .. ou allouer en utilisant malloc (plus et code plus laid ...). N'utilisez PAS une variable locale: elle sera allouée sur la pile et sera donc supprimée après la sortie de la méthode d'installation.

+0

C'est une idée horrible, et le recommander dans un forum public est également une mauvaise idée. –

1

(id) L'expéditeur montre que tout ce que vous transmettez sur UIButton click event passe directement à cette méthode et quel que soit le type, il prend automatiquement comme si vous passiez le bouton button puis prend le bouton comme expéditeur. tag etc

Questions connexes