我有一个UIViewController
用于iPad应用,用户可以通过触摸80个按钮之一来挑选80个谜题中的一个。而不是手动将80 UIButton
连接到IBAction
方法,有没有办法以编程方式或其他一些聪明的方式执行此操作?
另一种选择当然是建立自定义视图并自己完成所有工作,但我想知道上述内容是否可以更容易。
答案 0 :(得分:2)
你的意思是80个UIButton到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 :(得分:1)
您可以在视图中列出对象(子视图)以查找所有按钮。当然,你需要以某种方式清除其他物体。
您可以为按钮添加addTarget来设置其操作方法。
每个操作方法都会收到一个指向UI对象的指针。您只需要将指针与对象列表进行比较,以确定它是哪一个。
答案 2 :(得分:1)
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
}
}
答案 3 :(得分:1)
这样的事情可能有用:
- (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.
}