Xcode中IBActions的功能?

时间:2013-10-30 18:07:13

标签: ios xcode

我的主故事板上有一堆IB动作,全部由文本标签顶部的按钮触发。因此,您点击按钮1,它执行代码标签1,您点击按钮2,它执行标签2的代码,依此类推。

如果我为每个IBAction编写几乎相同的代码,我知道我做错了。在ActionScript中(当天回来!)我只是编写一个函数,并引用每个按钮和标签的实例名称。

我在下面列出了一段简化的代码。它工作正常,我只是想让它高效,但我不知道如何在Xcode中做到这一点。在此先感谢您的帮助!

- (IBAction)firstBtnPressed {

    self.firstLabel.text = rightNow;

}

- (IBAction)secondBtnPressed {

    self.secondLabel.text = rightNow;

}

3 个答案:

答案 0 :(得分:3)

您的实施完全没问题。如果你愿意,你可以在IB中给UIButton一个标签值,然后组合这些方法(将它们的两个动作设置为同一个方法):

- (IBAction)buttonPressed:(UIButton *)button {
    if (button.tag == 0) {
        self.firstLabel.text = rightNow;
    } else if (button.tag == 1) {
        self.secondLabel.text = rightNow;
    }
}

您也可以使用开关:

switch (button.tag) {
    case 0:
        self.firstLabel.text = rightNow;
        break;
    case 1:
        self.secondLabel.text = rightNow;
        break;      
    default:
        break;
}

我认为这就是你所追求的。如果我误解了什么,请告诉我。

编辑:

鉴于你有9个,我会亲自改变我的方法。您可以将它们全部放入数组并访问它们[self.myLabels[button.tag] setText:rightNow];,但这仍然需要9个IBOutlet。虽然没有问题,但它们很多。

你可以做的另一件事就是给他们一个比相应按钮高20分的标签,并在IBAction中做这样的事情:

UIView *viewToChange = [self.view viewWithTag:button.tag+20];
// used to protect yourself since IB allows the multiple views to have the same tag
if ([viewToChange isKindOfClass:[UILabel class]]) {
    ((UILabel *)viewToChange).text = rightNow;
}

这很简单,但它会将您的逻辑与您的按钮和标签的标记值紧密绑定。这样做的好处是简单的逻辑,并且没有所有UILabel的IBOutlets!

答案 1 :(得分:2)

在我看来,如果你有几个方法几乎完全相同的代码,那么你只有一个方法有一个大的if-else或switch语句试图弄清楚按下了什么按钮(除非你没有超过2或3个按钮)。

我不熟悉你的具体要求,但我会做什么(我正在做一些关于你需要的假设。我可能错了)是找到一种方法将UIButton s与UILabel秒。一种方法是创建我自己的UIButton子类,其标签为属性:

@interface MyButton : UIButton

@property (nonatomic, strong) UILabel *theLabel;

@end

通过这种方式,您可以将button1label1button2label2相关联,等等。这样做的好处是您只需编写以下代码即可会工作:

- (IBAction)buttonPressed:(id)sender {

    if ([sender isKindOfClass:[MyButton class]]) {

        MyButton *button = (MyButton*)sender;
        button.theLabel.text = rightNow;
    }
}

就是这样。没有大的if-else或switch语句。没有重复的代码。

希望这有帮助!

答案 2 :(得分:1)

您可以将每个UIButton添加为属性,然后检查按下了哪个:

- (IBAction)tappedButton:(id)sender {

    if ( sender == _button1){

        NSLog(@"Button 1 pressed");
    }
    //....
}

连接动作插座时,需要选择“sender”作为参数。现在您可以将所有按钮连接到同一个插座。