Программно добавить несколько кнопок в представление, вызвать один и тот же метод, определить, какая кнопка была

Я хочу программно добавить несколько UIButton в представление - количество кнопок неизвестно во время компиляции.

Я могу сделать один или несколько таких UIButton (в цикле, но для простоты укороченным):

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

Скопировано / отредактировано по этой ссылке: Как программно создать базовый UIButton?

Но как определить в buttonClicked: какая кнопка была нажата? Я хотел бы передать данные тега, если возможно, чтобы идентифицировать кнопку.


person just_another_coder    schedule 15.04.2010    source источник


Ответы (9)


Вы можете либо сохранить ссылку на фактический объект кнопки где-нибудь, что имеет значение (например, массив), либо установить для тега кнопки что-то полезное (например, смещение в каком-либо другом массиве данных). Например (с помощью тега, поскольку это обычно необходимо):

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]);
}
person Jason Coco    schedule 15.04.2010
comment
а что, если вы хотите, чтобы для каждой кнопки было разное действие? - person Laur Stefan; 03.12.2014

Вы можете присвоить кнопке тег.

button.tag = i;

Затем в -buttonClicked: проверьте тег отправителя:

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

Думаю, это был бы лучший ответ: -
http://conecode.com/news/2012/05/ios-how-to-create-a-grid-of-uibuttons/

person Nico    schedule 05.09.2013

Для этого дайте разные теги каждой кнопке и используйте такой код:

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

& в методе

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

и так далее, чтобы проверить, какая кнопка вызывается

person Aakil Ladhani    schedule 18.11.2011

Если вы хотите добавить кнопки во время выполнения, их будет 10 20 50 или больше. Тогда вам следует использовать режим прокрутки пользовательского интерфейса в этом состоянии.

Когда кнопки будут сгенерированы, размер вашей прокрутки должен быть соответственно увеличен.

И вы можете написать такой код

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];
        }
person Akram Khan    schedule 05.09.2012

UIButton имеет свойство tag. Используйте это, и в своем buttonClicked методе вы можете проверить кнопку, по которой была нажата кнопка, на основе ее тега. Возможно, вы захотите сохранить константы для того, какая кнопка есть что.

person Kaili    schedule 15.04.2010

Для каждой кнопки установите соответствующий тег, а затем обратитесь к тегу в своем действии. т.е.

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

Вы можете легко установить тег на основе индекса вашей итерации, если вы создаете кнопки в цикле. А затем в вашем действии:

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

У кого-то может быть такая проблема:

Ответ Джейсона Коко работал у меня нормально, пока я не захотел использовать тег для доступа к свойствам из массива NSArray, который был определен как свойство.

Оказалось, что свойство должно было быть определено как «сохранить», а не «слабое».

person juggler    schedule 24.03.2013

Версия Swift (с ярлыками):

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

Вызов с использованием self.viewWithTag (i) как UILabel:

(cell.viewWithTag(5) as UILabel).text
person ericgu    schedule 20.01.2015