В UIViewController как я могу заставить один метод автоматически обрабатывать множество кнопок

#ios #ipad #uiviewcontroller

#iOS #iPad #uiviewcontroller

Вопрос:

У меня есть UIViewController приложение для iPad, в котором пользователь может выбрать одну из 80 головоломок, коснувшись одной из 80 кнопок. Вместо того, чтобы вручную подключать 80 UIButton к IBAction методу, есть ли какой-либо способ сделать это программно или каким-либо другим умным способом?

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

Комментарии:

1. Google: «uitableview SQLite» Я бы рассказал вам больше о SQLite, но я сам новичок, использующий его. Это сделает вашу жизнь в миллион раз проще.

Ответ №1:

Вы имеете в виду 80 кнопок UIButtons для 80 действий или 80 кнопок для 1 действия? Вы могли бы добавить все кнопки программно, используя это : .h

  @interface myfile : UIViewController {
IBOutlet UIButton *button;
}
  

.m

 - (void)viewDidLoad{

[button setTitle:@"1" forState: UIControlStateNormal];
button.frame = CGRectMake (x position, y position, width, height);
 [button addTarget:self action: @selector(myaction:) forControlEvents :UIControlEventTouchUpInside];
[self.view addSubView:button];

}
  

И все остальные кнопки, связанные с одним действием, вызываются:

 -(IBAction)myaction:(id)sender {
switch([sender tag])
case 1:
//open puzzle 1
break;
case 2:
//open puzzle 2
break;
...
default:
break;
}
  

и т. д

Ответ №2:

что-то вроде этого может сработать:

 - (void) viewDidLoad
{

for ( UIView* potentialButton in view.subviews )
{
  if ( [potentialButton isKindOfClass: [UIButton class]] )
  {
     UIButton* actualButton = (UIButton*) potentialButton;
     [actualButton addTarget: self action: @selector( onButtonPress: ) forControlEvents: UIControlEventTouchUpInside];
   }
}

...

}

- (void) onButtonPress: (UIButton*) sender
{
  // determine which button here, by tag, or perhaps by button title, etc.
}
  

Комментарии:

1. Да, я закончил делать именно это!

Ответ №3:

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

Вы можете сделать addTarget для кнопок, чтобы установить их методы действия.

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

Комментарии:

1. или для этой цели можно использовать свойство тега элемента управления

Ответ №4:

Interface Builder позволит вам подключить 80 объектов к 1 методу, и я думаю, вы сможете сделать все это сразу с помощью множественного выбора (я перепроверю).) Затем в рамках этого метода вы можете использовать значение отправителя (id), чтобы определить, какая это кнопка; например, сказав

 if([[[(UIButton*)sender titleLabel] text] isEqualToString:@"Puzzle 1"]){
    // open puzzle 1
}
  

Если ваши заголовки последовательны, вы можете перебирать их:

 NSString* senderTitle =  [[(UIButton*)sender titleLabel] text];

for(int i=1; i<=80; i  ){
    if([senderTitle isEqualToString:[NSString stringWithFormat:@"Puzzle %d",i]]){
         // open puzzle i
    }
}
  

Комментарии:

1. упс — я только что проверил — вы не можете добавить несколько отправителей с помощью Interface Builder. Однако, как указывали другие ответы, вы могли бы перебирать их в viewDidLoad и addTarget: для каждого из них. [obj addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; `