在UIViewController中我怎么能有一个方法自动处理很多按钮

时间:2011-10-12 03:21:30

标签: ios ipad uiviewcontroller

我有一个UIViewController用于iPad应用,用户可以通过触摸80个按钮之一来挑选80个谜题中的一个。而不是手动将80 UIButton连接到IBAction方法,有没有办法以编程方式或其他一些聪明的方式执行此操作?

另一种选择当然是建立自定义视图并自己完成所有工作,但我想知道上述内容是否可以更容易。

4 个答案:

答案 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.
}