36

在我的项目中,我必须控制 40 个按钮的动作,但我不想创建 40 个 IBAction,我可以只使用一个 IBAction,如何?

4

7 回答 7

56

如果您使用界面生成器来创建按钮,只需将它们指向相关类中的相同 IBAction。

然后,您可以通过读取按钮中的文本来区分 IBAction 方法中的按钮...

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"Button pressed: %@", [sender currentTitle]);    
}

...或者通过tag在 Xcode 中设置属性并通过[sender tag]. (如果您使用这种方法,请从 1 开始标记,因为 0 是默认值,因此几乎没有用处。)

于 2011-05-02T14:20:38.380 回答
12
-(IBAction)myButtonAction:(id)sender {
    if ([sender tag] == 0) {
        // do something here
    }
    if ([sender tag] == 1) {
        // Do something here
    }    
}

// in Other words

-(IBAction)myButtonAction:(id)sender {
        switch ([sender tag]) {
        case 0:
            // Do something here
            break;
        case 1:
           // Do something here
             break;
       default:
           NSLog(@"Default Message here");
            break;
}
于 2012-12-26T17:05:55.733 回答
9

设置所有按钮以使用该操作。动作通常有一个sender参数,您可以使用该参数来确定哪个按钮正在调用该动作。区分按钮的一种流行方法是为每个按钮的tag属性分配不同的值。因此,您可能有 40 个按钮,其标签范围从 1 到 40。(0 可能不是标签的好选择,因为这是默认值,并且您忘记设置标签的任何按钮都将 0 作为标记值。)

当所有按钮都做大致相同的事情时,这种技术最有用,比如计算器或键盘上的按钮。如果每个按钮都做完全不同的事情,那么你仍然会得到相当于 40 个方法的结果,但是你用你自己的 switch 语句代替了 Objective-C 的消息传递系统。在这种情况下,最好花时间创建尽可能多的操作,并适当地分配它们。

于 2011-05-02T14:18:59.950 回答
4

当然。只需将所有按钮连接到 Interface Builder 中的相同操作方法。使用方法的sender参数(可能与按钮的tag属性结合使用)来识别哪个按钮正在发送事件。

于 2011-05-02T14:17:10.197 回答
0

只需使用一个 IBAction 并将其分配给您的所有按钮。

于 2011-05-02T14:17:07.377 回答
0

我自己只是使用了上述方法,选择了一些按钮,但将它们全部转换并使用了开关盒

-(IBAction)buttons:(id)sender
{

    switch ([sender tag])

    {

        case 0 :

    }
}
于 2013-04-15T13:19:18.190 回答
0

似乎您正在获得所需的所有答案,但我想添加到其他所有人的答案中。

无论您要使用一个 IBAction 还是 40 个操作,都取决于您希望按钮执行的操作。如果所有按钮都做完全不同的事情,您需要所有单独的 IBAction,但如果您希望所有按钮都做同样的事情,您可以只使用一个。我需要有关这些按钮和操作的更多详细信息,但您可能有每个按钮的标题,因此您可以使用它来区分每个按钮并创建消息或由按下的特定按钮自定义的内容。这是示例。每次按下按钮时,标签都会显示一条消息,上面写着“按下按钮的 ietitle”。

通过这种方式,您不需要对所有 40 种模式进行 switch case。只需 2-3 行代码,您仍然可以通过按下按钮来显示或执行个性化的操作。

- (IBAction)button_Clicked:(UIButton *)sender {

    //Get the buttons' titles.
    NSString *title =[sender titleForState:UIControlStateNormal];

    //Construct a message that includes the *title. 
    NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];

    //Assigns the *plainText to the label. 
    self.Label.text=plainText;

}
@end
于 2013-08-13T17:07:23.327 回答