web-dev-qa-db-fra.com

Ajoutez plusieurs boutons à une vue par programme, appelez la même méthode, déterminez le bouton correspondant.

Je souhaite ajouter plusieurs UIButtons à une vue par programme - le nombre de boutons est inconnu au moment de la compilation.

Je peux créer un ou plusieurs UIButton comme ceci (dans une boucle, mais pour des raisons de simplicité):

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
       action:@selector(buttonClicked:)
forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Button x" forState:UIControlStateNormal];
button.frame = CGRectMake(100.0, 100.0, 120.0, 50.0);
[view addSubview:button];

Copié/édité à partir de ce lien: Comment créer un UIButton de base par programmation?

Mais comment puis-je déterminer dans buttonClicked: quel bouton a été cliqué? J'aimerais transmettre les données de balises si possible pour identifier le bouton.

27
just_another_coder

Vous pouvez soit conserver une référence à l'objet bouton réel quelque part (par exemple, un tableau), soit définir le tag du bouton sur quelque chose d'utile (comme un décalage dans un autre tableau de données). Par exemple (en utilisant la balise, puisque c'est généralement utile):

for( int i = 0; i < 5; i++ ) {
  UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [aButton setTag:i];
  [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
  [aView addSubview:aButton];
}

// then ...

- (void)buttonClicked:(UIButton*)button
{
  NSLog(@"Button %ld clicked.", (long int)[button tag]);
}
46
Jason Coco

Vous pouvez assigner une étiquette au bouton.

button.tag = i;

Puis dans -buttonClicked:, vérifiez la balise de l'expéditeur:

-(void)buttonClicked:(UIButton*)sender {
   int tag = sender.tag;
   ...
}
7
kennytm

Je pense que ce serait la meilleure réponse: -
http://conecode.com/news/2012/05/ios-how-to-create-a-grid-of-uibuttons/

3
Nico

Pour cela, attribuez une étiquette différente à chaque bouton et utilisez un code comme celui-ci: 

[btn1 addTarget:self action:@selector(pressbtn:) forControlEvents:UIControlEventTouchUpInside];   
   [btn2 addTarget:self action:@selector(pressbtn:) forControlEvents:UIControlEventTouchUpInside];

& en méthode 

-(void)pressbtn:(id)sender    {
 UIButton *button=sender;
        if (button.tag==1)
{
  NSLog(@"Press button 1");
}
    if (button.tag==2)
{
  NSLog(@"Press button 2");
}

et ainsi de suite pour vérifier quel bouton s'appelle

1
Aakil Ladhani

UIButton a une propriété tag. Utilisez cela et dans votre méthode buttonClicked, vous pouvez vérifier le bouton sur lequel vous avez cliqué en fonction de sa balise. Vous voudrez peut-être conserver des constantes pour quel bouton est quoi.

0
Kaili

La version Swift (avec étiquettes):

 for index in 1...5 {
      var label = UILabel()
      label.tag = index
      labelsDictionary["Label\(index)"] = label
      self.addSubview(label)
    }

Appelez en utilisant self.viewWithTag (i) comme UILabel:

(cell.viewWithTag(5) as UILabel).text
0
ericgu

Pour chacun de vos boutons, définissez une balise appropriée, puis reportez-vous à la balise dans votre action. c'est à dire.

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
...
button.tag = 1
[view addSubview:button]; 

Vous pouvez facilement définir la balise en fonction de l'index de votre itération, si vous créez des boutons dans une boucle. Et ensuite dans votre action:

- (void)aButtonWasTapped:(UIButton *)source {
    if( source.tag == 1 ) {
        // etc
    }
}
0
dannywartnaby

Si vous souhaitez ajouter des boutons au moment de l'exécution, il y aura 10 20 50 ou plus. Ensuite, vous devriez utiliser la vue de défilement ui dans cette condition. 

Lorsque les boutons seront générés, la taille de votre vue de défilement devrait être augmentée en conséquence.

Et vous pouvez écrire le code comme ça

scrollview = [[UIScrollView alloc] init];      
        scrollview.contentSize = CGSizeMake(INVOICE_ADDITEM_SCROLLVIEW_CONTENT_WIDTH, INVOICE_ADDITEM_SCROLLVIEW_CONTENT_HEIGHT);
        scrollview.frame = CGRectMake(0,50, SCROLLVIEW_WIDTH, SCROLLVIEW_HEIGHT);
        //  scrollview.backgroundColor = [UIColor whiteColor];
        scrollview.scrollsToTop = NO;
        scrollview.delegate = self;
        [self.view addSubview:scrollview];


  for (int pos = 0; pos < 2; pos++) {
            UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];
            [but setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
            [but setImage:[UIImage imageNamed:@"checkbox_active.png"] forState:UIControlStateSelected];
            [but setFrame:CGRectMake(TXT_FLD_X_CORD+90, 295, 20, 20)];
            //            [but setCenter:CGPointMake( 50,  i*40+20 )];
            but.tag = pos;
            /*if(pos==0)
            {
            [but setImage:[UIImage imageNamed:@"checkbox_active.png"] forState:UIControlStateNormal];
           // [but setImage:[UIImage imageNamed:@"checkbox_active.png"] forState:UIControlStateSelected];
            }*/
            [but setCenter:CGPointMake(pos*90+125 ,310)];
            [but addTarget:self action:@selector(checkboxButton:) forControlEvents:UIControlEventTouchUpInside];
            [scrollview addSubview:but];
        }
0
Akram Khan

Quelqu'un pourrait avoir ce problème:

Jason Coco answer a bien fonctionné pour moi, jusqu'à ce que je veuille utiliser la balise pour accéder aux propriétés d'un NSArray défini comme propriété. 

Il s'avère que la propriété devait être définie comme "conserver" au lieu de "faible".

0
juggler