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