Добавьте несколько кнопок в представление программно, вызовите один и тот же метод, определите, какая кнопка была - PullRequest
28 голосов
/ 15 апреля 2010

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

Я могу сделать один или несколько 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: какая кнопка была нажата? Я хотел бы передать данные тега, если это возможно, чтобы идентифицировать кнопку.

Ответы [ 9 ]

46 голосов
/ 15 апреля 2010

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

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]);
}
7 голосов
/ 15 апреля 2010

Вы можете назначить тег для кнопки.

button.tag = i;

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

-(void)buttonClicked:(UIButton*)sender {
   int tag = sender.tag;
   ...
}
3 голосов
/ 05 сентября 2013

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

1 голос
/ 05 сентября 2012

Если вы хотите добавить кнопки во время выполнения, то их будет 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];
        }
1 голос
/ 18 ноября 2011

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

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

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

0 голосов
/ 20 января 2015

Версия 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
0 голосов
/ 25 марта 2013

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

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

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

0 голосов
/ 15 апреля 2010

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

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

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

- (void)aButtonWasTapped:(UIButton *)source {
    if( source.tag == 1 ) {
        // etc
    }
}
0 голосов
/ 15 апреля 2010

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

...