49 votes

Passage de paramètres sur l'action du bouton: @selector

Je souhaite transmettre l'URL du film de mon bouton généré dynamiquement à MediaPlayer:

 [button addTarget:self action:@selector(buttonPressed:) withObject:[speakers_mp4 objectAtIndex:[indexPath row]] forControlEvents:UIControlEventTouchUpInside];
 

mais action:@selector() withObject: ne fonctionne pas?

N 'y a-t-il pas une autre solution?

Merci pour l'aide!

61voto

Tristan Points 2331

Edit. Trouvé une façon plus soignée!

Un argument que le bouton peut recevoir est - (id)sender. Cela signifie que vous pouvez créer un nouveau bouton, héritant de UIButton, qui vous permet de stocker de l'autre arguments. Espérons que ces deux extraits illustrent quoi faire.

  myOwnbutton.argOne = someValue
  [myOwnbutton addTarget:self action:@selector(buttonTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];

et

- (IBAction) buttonTouchUpInside:(id)sender {
  MyOwnButton *buttonClicked = (MyOwnButton *)sender; 
  //do as you please with buttonClicked.argOne
}

-------------------------------
C'était ma proposition initiale.

Il y a un moyen d'obtenir le même résultat, mais ce n'est pas assez. Supposons que vous vouliez ajouter un paramètre à la navigate méthode. Le code ci-dessous ne vous permettra pas de passer ce paramètre à l' navigate.

[button addTarget:self action:@selector(navigate) forControlEvents:UIControlEventTouchUpInside];

Pour contourner ce problème, vous pouvez déplacer la naviguer method d'une classe en soi et l'option "paramètres" en tant qu'attributs de la classe...

NavigationAid *navAid = [[NavigationAid alloc] init];
navAid.firstParam = someVariableOne
navAid.secondParam = someVariableTwo
[button addTarget:navAid action:@selector(navigate) forControlEvents:UIControlEventTouchUpInside];

Bien sûr, vous pouvez garder la méthode de naviguer dans la classe d'origine et de l'avoir appelé, par l'aide à la navigation, aussi longtemps que il sait où le trouver.

NavigationAid *navAid = [[NavigationAid alloc] init];
navAid.whereToCallNavigate = self
navAid.firstParam = someVariableOne
navAid.secondParam = someVariableTwo
[button addTarget:navAid action:@selector(navigate) forControlEvents:UIControlEventTouchUpInside];

Comme je l'ai dit, c'est pas joli, mais il a travaillé pour moi et je n'ai pas trouvé quelqu'un qui suggère toute autre solution de travail.

32voto

orafaelreis Points 161

J'ai trouvé une solution. L'appel:

 -(void) someMethod{
    UIButton * but;
    but.tag = 1;//some id button that you choice 
    [but addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
}
 

Et voici la méthode appelée:

 -(void) buttonPressed : (id) sender{
    UIButton *clicked = (UIButton *) sender;
    NSLog(@"%d",clicked.tag);//Here you know which button has pressed
}
 

12voto

Trausti Thor Points 2224

J'ai fait une solution basée, en partie, par les informations ci-dessus. Je viens de mettre la titleLabel.texte de la chaîne que je veux passer, et de définir la titleLabel.hidden = OUI

Comme ceci :

    UIButton *imageclick = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
    imageclick.frame = photoframe;
    imageclick.titleLabel.text = [NSString stringWithFormat:@"%@.%@", ti.mediaImage, ti.mediaExtension];
    imageclick.titleLabel.hidden = YES;

De cette façon, il n'est pas nécessaire pour un héritage ou d'une catégorie et il n'y a pas de fuite de mémoire

11voto

Toro Points 4827

Vous pouvez sous-classer un UIButton nommé MyButton et transmettre le paramètre par les propriétés de MyButton.

Ensuite, récupérez le paramètre auprès de l'expéditeur (id).

1voto

Fawad Masud Points 141

Vous pouvez définir la balise du bouton et y accéder depuis l'expéditeur en action

 [btnHome addTarget:self action:@selector(btnMenuClicked:)     forControlEvents:UIControlEventTouchUpInside];
                    btnHome.userInteractionEnabled = YES;
                    btnHome.tag = 123;
 

Dans la fonction appelée

 -(void)btnMenuClicked:(id)sender
{
[sender tag];

    if ([sender tag] == 123) {
        // Do Anything
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X