Ajouter un plusieurs boutons à une vue programmation, appelez la même méthode, déterminer quel bouton il était
-
27-09-2019 - |
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.
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;
...
}
Je pense que ce serait la meilleure réponse: -
http://conecode.com/ Actualités / 2012/05 / ios-how-to-créer-un-grille de-UIButtons /
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