В UIViewController, как я могу иметь один метод автоматически обрабатывать много кнопок - PullRequest
1 голос
/ 12 октября 2011

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

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

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

Вы имеете в виду 80 кнопок UIB для 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;
}

и т.д.

1 голос
/ 12 октября 2011

Интерфейсный конструктор позволит вам соединить 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 голос
/ 12 октября 2011

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

- (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 голос
/ 12 октября 2011

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

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

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

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