我的主故事板上有一堆IB动作,全部由文本标签顶部的按钮触发。因此,您点击按钮1,它执行代码标签1,您点击按钮2,它执行标签2的代码,依此类推。
如果我为每个IBAction编写几乎相同的代码,我知道我做错了。在ActionScript中(当天回来!)我只是编写一个函数,并引用每个按钮和标签的实例名称。
我在下面列出了一段简化的代码。它工作正常,我只是想让它高效,但我不知道如何在Xcode中做到这一点。在此先感谢您的帮助!
- (IBAction)firstBtnPressed {
self.firstLabel.text = rightNow;
}
- (IBAction)secondBtnPressed {
self.secondLabel.text = rightNow;
}
答案 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
通过这种方式,您可以将button1
与label1
,button2
与label2
相关联,等等。这样做的好处是您只需编写以下代码即可会工作:
- (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”作为参数。现在您可以将所有按钮连接到同一个插座。