2

我的主情节提要上有一堆 IB 动作,它们都是由文本标签顶部的按钮触发的。因此,您点击按钮 1,它执行代码标签 1,您点击按钮 2,它执行标签 2 的代码,依此类推。

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

我在下面包含了一段简化的代码。它工作正常,我只是想让它高效,但不确定如何在 Xcode 中执行此操作。提前感谢您的帮助!

- (IBAction)firstBtnPressed {

    self.firstLabel.text = rightNow;

}

- (IBAction)secondBtnPressed {

    self.secondLabel.text = rightNow;

}
4

3 回答 3

3

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

- (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 个 IBOutlets。虽然没有问题,但其中很多。

您可以做的另一件事是给他们一个比相应按钮高 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!

于 2013-10-30T18:13:17.900 回答
2

在我看来,如果你有几个方法几乎相同的代码与你只有一个方法和一个大的 if-else 或 switch 语句试图找出按下了什么按钮(除非你有不超过 2 或 3纽扣)。

我不熟悉您的确切要求,但我会做的(我正在对您的需求做出一些假设。我可能错了)是找到一种将UIButtons 与UILabels 关联的方法。一种方法是创建我自己的UIButton具有标签作为属性的子类:

@interface MyButton : UIButton

@property (nonatomic, strong) UILabel *theLabel;

@end

通过这种方式,您可以关联button1with label1button2withlabel2等。这样做的好处是您只需编写以下代码,它就会起作用:

- (IBAction)buttonPressed:(id)sender {

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

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

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

希望这可以帮助!

于 2013-10-30T18:32:44.673 回答
1

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

- (IBAction)tappedButton:(id)sender {

    if ( sender == _button1){

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

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

于 2013-10-30T18:19:48.880 回答