Ajouter un plusieurs boutons à une vue programmation, appelez la même méthode, déterminer quel bouton il était

StackOverflow https://stackoverflow.com/questions/2646297

Question

Je veux ajouter plusieurs UIButtons à programme en vue -. Le nombre de boutons est inconnu au moment de la compilation

Je peux faire une ou plusieurs UIButton est comme si (dans une boucle, mais court-circuité pour simplifier):

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é / Edité à partir de ce lien: Comment puis-je créer une base UIButton programme

Mais comment puis-je déterminer dans ButtonClicked: quel bouton a été cliqué? Je voudrais transmettre des données d'étiquette si possible d'identifier le bouton.

Était-ce utile?

La solution

soit Vous pourriez conserver une référence à l'objet bouton réelle quelque part qui a importé (comme un tableau) ou définir l'étiquette du bouton pour quelque chose d'utile (comme un décalage dans un autre tableau de données). Par exemple (en utilisant la balise, car il est généralement utile doit):

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]);
}

Autres conseils

Vous pouvez attribuer une étiquette au bouton.

button.tag = i;

Ensuite, dans -buttonClicked:, vérifiez l'étiquette de l'expéditeur:

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

Pour qui donnent balise différent à chaque code du bouton et l'utilisation comme ceci:

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

& dans la 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 que le bouton est appelé

Si vous voulez ajouter des boutons lors de l'exécution alors il y aura 10 20 50 ou plus. Ensuite, vous devriez utiliser ui défilement voir dans cet état.

Quand les boutons seront générer alors la taille de votre vue de défilement doit être augmentée en conséquence.

Et vous pouvez écrire le code comme ceci

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];
        }

UIButton possède une propriété tag. Utilisez et que dans votre méthode de buttonClicked, vous pouvez vérifier le bouton qui a été cliqué basé sur l'étiquette de lui. Pourrait vouloir garder des constantes autour de ce bouton est quoi.

Pour chacun de vos boutons mis une étiquette appropriée, puis reportez-vous à l'étiquette dans votre action. i.e..

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

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

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

Quelqu'un pourrait avoir ce problème:

Jason Coco réponse a bien fonctionné pour moi, jusqu'à ce que je voulais utiliser l'étiquette d'accéder aux propriétés d'un NSArray qui a été défini comme une propriété.

Il se trouve que la propriété devait être définie comme « conserver » au lieu de « faible ».

La version Swift (avec étiquettes):

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

Appel à l'aide à l'aide self.viewWithTag (i) comme UILabel:

(cell.viewWithTag(5) as UILabel).text
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top