Добавьте несколько программ в представление программно, вызовите тот же метод, определите, какая кнопка была
Я хочу программно добавить несколько UIButtons в представление - количество кнопок неизвестно во время компиляции.
Я могу сделать один или несколько 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: какая кнопка была нажата? Я бы хотел передать данные тега, если это возможно, чтобы идентифицировать кнопку.
Ответы
Ответ 1
Вы можете либо сохранить ссылку на фактический объект кнопки где-то, что имело значение (например, массив), либо установить тег кнопки на что-то полезное (например, смещение в каком-то другом массиве данных). Например (используя тег, поскольку это обычно полезно):
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]);
}
Ответ 2
Вы можете назначить тег кнопке.
button.tag = i;
Затем в -buttonClicked:
проверьте тег отправителя:
-(void)buttonClicked:(UIButton*)sender {
int tag = sender.tag;
...
}
Ответ 3
Я думаю, что это был бы лучший ответ:
http://conecode.com/news/2012/05/ios-how-to-create-a-grid-of-uibuttons/
Ответ 4
Для этого дайте разные теги каждой кнопке и используйте следующий код:
[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");
}
и т.д., чтобы проверить, какая кнопка вызывается
Ответ 5
UIButton имеет свойство tag
. Используйте это и в своем методе buttonClicked
, вы можете проверить кнопку, которая была нажата на основе этого тега. Возможно, вы хотите сохранить константы вокруг какой кнопки.
Ответ 6
Для каждой из ваших кнопок установите соответствующий тег, а затем обратитесь к тегу в своем действии. то есть.
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
...
button.tag = 1
[view addSubview:button];
Вы можете легко установить тег на основе индекса вашей итерации, если вы создаете кнопки в цикле. И затем в вашем действии:
- (void)aButtonWasTapped:(UIButton *)source {
if( source.tag == 1 ) {
// etc
}
}
Ответ 7
Если вы хотите добавить кнопки во время выполнения, тогда будет 10 20 50 или более. Затем вы должны использовать вид прокрутки ui в этом состоянии.
Когда кнопки будут сгенерированы, ваш размер прокрутки должен быть соответственно увеличен.
И вы можете написать код, подобный этому
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];
}
Ответ 8
У кого-то может быть такая проблема:
Ответ Джейсона Коко работал отлично для меня, пока я не захотел использовать тег для доступа к свойствам из NSArray, который был определен как свойство.
Оказывается, свойство должно быть определено как "сохранить" вместо "слабого".
Ответ 9
Версия 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