Aggiungere un più pulsanti per una visione a livello di codice, chiamare lo stesso metodo, determinare quale pulsante è stato

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

Domanda

Voglio aggiungere a livello di codice più UIButtons ad una vista -. Il numero di pulsanti è sconosciuto al momento della compilazione

Posso fare una o più UIButton di questo modo (in un ciclo, ma corto per semplicità):

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

copiato / Edited da questo link: Come faccio a creare una base di programmazione UIButton?

Ma come faccio a determinare in ButtonClicked: quale pulsante è stato cliccato? Mi piacerebbe passare i dati dei tag, se possibile, per identificare il pulsante.

È stato utile?

Soluzione

Si potrebbe o mantenere un riferimento al reale da qualche oggetto pulsante che contava (come un array) o impostare tag del pulsante per qualcosa di utile (come un offset in qualche altro array di dati). Per esempio (utilizzando il tag, dal momento che questo è in genere necessario 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]);
}

Altri suggerimenti

È possibile assegnare un tag per il pulsante.

button.tag = i;

Poi, nel -buttonClicked:, controllare l'etichetta del mittente:

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

Per questo dare tag diverso per ciascun codice del pulsante e l'uso in questo modo:

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

& nel metodo

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

e così via per controllare quale tasto è chiamato

Se si desidera aggiungere pulsanti in fase di esecuzione, allora ci saranno 10 20 50 o di più. Poi si dovrebbe usare ui scorrere visualizzare in questa condizione.

Quando i pulsanti saranno generare allora il vostro rotolo dimensioni di visualizzazione dovrebbe essere aumentato di conseguenza.

E si può scrivere il codice come questo

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 ha una proprietà tag. Utilizzare tale e nel metodo buttonClicked, è possibile controllare il pulsante che è stato cliccato basati su di esso di tag. Potrebbe voler mantenere costanti intorno per quello pulsante è quello.

Per ognuno dei pulsanti impostare un tag appropriato, e quindi fare riferimento al tag nella vostra azione. cioè.

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

È possibile impostare facilmente il tag in base all'indice del vostro iterazione, se si sta creando pulsanti in un ciclo. E poi nella vostra azione:

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

Qualcuno potrebbe avere questo problema:

di Jason Coco risposta ha funzionato bene per me, fino a quando ho voluto usare il tag di proprietà di accesso da un NSArray che è stato definito come una proprietà.

scopre la proprietà dovevano essere definito "trattenere" invece di "debole".

La versione Swift (con etichette):

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

chiamate utilizzando utilizzando self.viewWithTag (i) come UILabel:

(cell.viewWithTag(5) as UILabel).text
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top