Añadir varios botones a una vista mediante programación, llame al mismo método, determinar qué botón fue

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

Pregunta

Quiero añadir programación varios UIButtons a una vista -. El número de botones se conoce en tiempo de compilación

Me puede hacer que uno o más de UIButton como tal (en un bucle, pero en corto para simplificar):

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

copiados / Editado desde este enlace: ¿Cómo se crea un UIButton básica mediante programación?

Pero, ¿cómo puedo determinar en buttonClicked: qué botón se ha hecho clic? Me gustaría pasar los datos de la etiqueta si es posible identificar el botón.

¿Fue útil?

Solución

Se podría mantener ya sea una referencia al objeto real en algún botón que importaba (como una matriz) o un conjunto de etiquetas del botón para algo útil (como un desplazamiento de alguna otra matriz de datos). Por ejemplo (usando la etiqueta, ya que este es generalmente deben útil):

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

Otros consejos

Se puede asignar una etiqueta al botón.

button.tag = i;

Luego, en -buttonClicked:, compruebe la etiqueta del remitente:

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

Para que le dan diferentes de etiquetas para cada botón y utilice el código de la siguiente manera:

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

& en el método

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

y así sucesivamente para comprobar qué botón se llama

Si desea añadir botones en tiempo de ejecución, entonces habrá 10 20 50 o más que eso. A continuación, usted debe usar la interfaz de usuario de desplazamiento ver en esta condición.

Cuando los botones serán generar entonces su desplazamiento tamaño de la vista se debe aumentar en consecuencia.

Y usted puede escribir el código como este

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 tiene una propiedad tag. Usa ese método y en su buttonClicked, se puede comprobar el botón que se ha hecho clic sobre la base de que la etiqueta. Puede que desee mantener constantes alrededor por lo que el botón es lo.

Para cada uno de sus botones establece una etiqueta adecuada, y luego consulte la etiqueta en su acción. es decir.

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

Se puede configurar fácilmente la etiqueta basada en el índice de la iteración, si va a crear botones en un bucle. Y luego, en su acción:

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

Alguien podría tener este problema:

La respuesta de Jason Coco funcionó bien para mí, hasta que me quería utilizar la etiqueta para acceder a las propiedades de un NSArray que se define como una propiedad.

Resulta que la propiedad tenía que ser definido como "mantener" en lugar de "débil".

La versión Swift (con etiquetas):

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

Call usando usando self.viewWithTag (i) como UILabel:

(cell.viewWithTag(5) as UILabel).text
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top