Adicione um botão múltiplo a uma exibição programaticamente, chame o mesmo método, determine qual botão foi

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

Pergunta

Quero adicionar programaticamente vários uibuttons a uma visualização - o número de botões é desconhecido no horário de compilação.

Eu posso fazer um ou mais uibutton como assim (em um loop, mas em curto por simplicidade):

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

Copiado/editado neste link:Como faço para criar um UIBUTTON básico programaticamente?

Mas como faço para determinar em ButtonClicked: Qual botão foi clicado? Eu gostaria de passar dados de tag, se possível, identificar o botão.

Foi útil?

Solução

Você pode manter uma referência ao objeto de botão real em algum lugar que importava (como uma matriz) ou definir a tag do botão para algo útil (como um deslocamento em alguma outra matriz de dados). Por exemplo (usando a tag, pois isso geralmente é ú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]);
}

Outras dicas

Você pode atribuir uma tag ao botão.

button.tag = i;

Então em -buttonClicked:, verifique a etiqueta do remetente:

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

Para isso, dê uma tag diferente de cada botão e use o código como este:

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

e no 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");
}

e assim por diante para verificar qual botão é chamado

Se você deseja adicionar botões no tempo de execução, haverá 10 20 50 ou mais do que isso. Então você deve usar a visualização de rolagem da interface do usuário nessa condição.

Quando os botões serão gerados, o tamanho da exibição de rolagem deve ser aumentado de acordo.

E você pode escrever o 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 tem um tag propriedade. Use isso e em seu buttonClicked Método, você pode verificar o botão que foi clicado com base na tag. Pode querer manter as constantes em torno de qual botão é o quê.

Para cada um dos seus botões, defina uma tag apropriada e consulte a tag em sua ação. ou seja

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

Você pode definir facilmente a tag com base no índice da sua iteração, se estiver criando botões em um loop. E então em sua ação:

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

Alguém pode ter esse problema:

Jason Coco's A resposta funcionou bem para mim, até que eu quisesse usar a tag para acessar as propriedades de um NSARRAY que foi definido como uma propriedade.

Acontece que a propriedade teve que ser definida como "reter" em vez de "fraco".

A versão Swift (com rótulos):

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

Ligue usando o uso de self.viewwithtag (i) como uilabel:

(cell.viewWithTag(5) as UILabel).text
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top