2010-04-15 16 views
27

Quiero agregar mediante programación múltiples UIButtons a una vista; el número de botones es desconocido en tiempo de compilación.Agregar varios botones a una vista mediante programación, llamar al mismo método, determinar qué botón era

Puedo hacer una 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: How do I create a basic UIButton programmatically?

Pero, ¿cómo puedo determinar en buttonClicked: ¿en qué botón se hizo clic? Me gustaría pasar datos de etiquetas si es posible para identificar el botón.

Respuesta

45

Puede mantener una referencia al objeto del botón real en algún lugar que importa (como una matriz) o establecer la etiqueta del botón a algo útil (como un desplazamiento en 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]); 
} 
+0

¡Muchas gracias! –

+1

aView en el sentido ??? .... –

+5

botón superpuesto. – Jitendra

7

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; 
    ... 
} 
+0

¡Muchas gracias! –

0

UIButton tiene una propiedad tag. Úselo y en su método buttonClicked, puede marcar el botón al que se hizo clic en función de su etiqueta. Puede que quiera mantener constantes alrededor de qué botón es qué.

0

Para cada uno de sus botones fijados una etiqueta adecuada y, a continuación se refieren a la etiqueta en su acción. es decir,

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

podrá ajustar 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 
    } 
} 
1

Para que le dan diferentes de etiquetas para cada botón & utilice un código como este:

[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é El botón se llama

0

Si desea agregar botones en tiempo de ejecución, entonces habrá 10 20 50 o más que eso. Entonces deberías usar ui scroll view en esta condición.

Cuando se generarán los botones, el tamaño de la vista de desplazamiento se aumentará en consecuencia.

Y se 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]; 
     } 
0

Alguien podría tener este problema: 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 definió como una propiedad.

Resulta que la propiedad debe definirse como "retener" en lugar de "débil".

0

La versión Swift (con etiquetas):

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

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

(cell.viewWithTag(5) as UILabel).text 
Cuestiones relacionadas