36 votes

IOS : une action IBA 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 seulement une IBAction, comment ?

1 votes

0 votes

Suivez cette réponse.. stackoverflow.com/questions/16050516/

56voto

middaparka Points 33832

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

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

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

...ou en réglant le tag dans Xcode et la lire en retour via [sender tag] . (Si vous utilisez cette approche, commencez les balises à 1, car 0 est la valeur par défaut et n'est donc pas très utile).

10 votes

Dans Xcode 4.6, l'utilisation des storyboards présente un bogue qui ne permet pas d'ajouter des connexions supplémentaires. Il suffit de faire toutes les connexions entre le bouton et le code (en ajoutant l'élément IBACTION et les supprimer tous sauf un.

6 votes

Je viens de réaliser que vous pouvez également multisélectionner tous les boutons UIButtons que vous avez créés dans IB en maintenant la touche CMD enfoncée et en les sélectionnant tous, puis en les faisant glisser avec la touche Ctrl vers le code, ce qui créera une seule action IBA avec tous les boutons UIButtons qui y sont connectés.

12voto

BigAppleBump Points 623
-(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;
}

1 votes

Je recommanderais une instruction switch et un typedef enum pour chaque balise pour plus de clarté si l'on utilise cette approche.

9voto

Caleb Points 72897

Paramétrez tous les boutons pour qu'ils utilisent cette action. Les actions ont généralement un sender que vous pouvez utiliser pour déterminer quel bouton appelle l'action. Un moyen courant de faire la différence entre les boutons est d'attribuer une valeur différente au paramètre tag propriété. Vous pouvez donc avoir 40 boutons avec des balises allant de 1 à 40 (0 n'est probablement pas un bon choix pour une balise puisque c'est la valeur par défaut et que tout bouton pour lequel vous aurez oublié de définir la balise aura 0 comme valeur de balise).

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 vous retrouvez toujours avec l'équivalent de 40 méthodes, mais vous remplacez le système de messagerie d'Objective-C par votre propre instruction switch. Dans ce cas, il est souvent préférable de prendre le temps de créer autant d'actions que nécessaire et de les affecter de manière appropriée.

4voto

Ole Begemann Points 85798

Il suffit de relier tous les boutons à la même méthode d'action dans Interface Builder. Utilisez la méthode sender (éventuellement en conjonction avec l'argument tag ) pour identifier le bouton qui envoie l'événement.

0voto

clive dancey Points 54

Je viens d'utiliser la méthode ci-dessus, j'avais une sélection de boutons mais je les ai tous convertis et j'ai utilisé la casse de commutateur à la place.

-(IBAction)buttons:(id)sender
{

    switch ([sender tag])

    {

        case 0 :

    }
}

0 votes

Si c'était moi, j'aurais des actions séparées pour chaque bouton, et j'extrairais le code commun dans une méthode séparée, appelée à partir de la méthode d'action de chaque bouton. Ce faisant, vous rendez le code beaucoup plus propre avec une seule relation bouton<->action pour chaque bouton et vous évitez l'utilisation d'un commutateur, qui est souvent une odeur de code.

0 votes

Il est vraiment injuste d'être rejeté quand on essaie seulement d'aider quelqu'un... parfois les réponses sont si compliquées qu'on a besoin de quelque chose de simple pour comprendre ce que l'on demande.

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