web-dev-qa-db-fra.com

IOS: un IBAction pour plusieurs boutons

Dans mon projet, je dois contrôler l'action de 40 boutons, mais je ne veux pas créer 40 IBAction, puis-je utiliser uniquement un IBAction, comment?

36
CrazyDev

Si vous utilisez le générateur d'interface pour créer les boutons, il vous suffit de les pointer vers le même IBAction dans la classe appropriée.

Vous pouvez ensuite différencier les boutons de la méthode IBAction en lisant le texte à partir du bouton ...

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"Button pressed: %@", [sender currentTitle]);    
}

... ou en définissant la propriété tag dans Xcode et en le relisant via [sender tag]. (Si vous utilisez cette approche, démarrez les balises à 1, car 0 est la valeur par défaut et est donc peu utile.)

56
John Parker
-(IBAction)myButtonAction:(id)sender {
    if ([sender tag] == 0) {
        // do something here
    }
    if ([sender tag] == 1) {
        // Do something here
    }    
}

// in Other words

-(IBAction)myButtonAction:(id)sender {
        switch ([sender tag]) {
        case 0:
            // Do something here
            break;
        case 1:
           // Do something here
             break;
       default:
           NSLog(@"Default Message here");
            break;
}
12
BigAppleBump

Définissez tous les boutons pour utiliser cette action. Les actions ont généralement un paramètre sender, que vous pouvez utiliser pour déterminer quel bouton appelle l'action. Un moyen courant de différencier les boutons consiste à attribuer une valeur différente à la propriété tag de chaque bouton. Donc, vous pourriez avoir 40 boutons avec des tags allant de 1 à 40. (0 n'est probablement pas un bon choix pour un tag car c'est la valeur par défaut, et tout bouton pour lequel vous oubliez de définir le tag aura 0 comme valeur valeur de tag.)

Cette technique est particulièrement utile lorsque tous les boutons font à peu près la même chose, comme les boutons d’une calculatrice ou d’un clavier. Si chacun des boutons fait quelque chose de complètement différent, vous obtenez toujours l'équivalent de 40 méthodes, mais vous substituez votre propre instruction switch au système de messagerie d'Objective-C. Dans ce cas, il est souvent préférable de consacrer tout votre temps à créer autant d’actions que nécessaire et à les assigner correctement.

9
Caleb

Sûr. Connectez simplement tous les boutons à la même méthode d'action dans Interface Builder. Utilisez l'argument sender de la méthode (éventuellement en association avec la propriété tag des boutons) pour identifier le bouton qui envoie l'événement.

4
Ole Begemann

Vient de me servir de la méthode ci-dessus, j'avais une sélection de boutons mais les a tous convertis et utilisé à la place

-(IBAction)buttons:(id)sender
{

    switch ([sender tag])

    {

        case 0 :

    }
}
0
clive dancey

Utilisez juste un IBAction et attribuez-le à tous vos boutons.

0
Joris Mans

On dirait que vous obtenez toutes les réponses dont vous avez besoin, mais je voulais ajouter aux réponses de tous les autres. 

Que vous souhaitiez utiliser un IBAction ou 40 actions dépend de ce que vous voulez que les boutons fassent. Si tous les boutons font des choses complètement différentes, vous avez besoin de toutes les IBActions distinctes, mais si vous voulez que tous fassent la même chose, vous pouvez n'en utiliser qu'une. J'ai besoin de plus de détails sur ces boutons et actions, mais vous avez probablement un titre pour chaque bouton, vous pouvez donc l'utiliser pour différencier chaque bouton et créer un message ou quelque chose qui est personnalisé par le bouton particulier enfoncé. Voici l'exemple. Chaque fois que vous appuyez sur un bouton, une étiquette affiche un message indiquant "c’est le titre du bouton" enfoncé. 

En procédant ainsi, vous n’avez pas besoin de changer de casse avec les 40 motifs. Vous pouvez toujours afficher ou faire quelque chose qui est individualisé en appuyant sur le bouton avec seulement 2-3 lignes de code.

- (IBAction)button_Clicked:(UIButton *)sender {

    //Get the buttons' titles.
    NSString *title =[sender titleForState:UIControlStateNormal];

    //Construct a message that includes the *title. 
    NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];

    //Assigns the *plainText to the label. 
    self.Label.text=plainText;

}
@end
0
misatota