2012-11-02 26 views
1

我是新开发人员,并且做了一些我写的东西,有时候是一个非常奇怪的代码。例如,在这种情况下,我制作了一个滚动视图来显示1到40之间的水平数字列表。每个数字都是按钮。我不想当用户点击一个数字时,这个按钮的背景图像会改变,当他点击另一个时,新按钮的背景也会改变(但第一个按钮会回到他的初始状态)。就像一个标签栏上...如何简化IOS的这个目标C代码?

要做到这一点我做了相同的代码40次(每个按钮):

- (IBAction)Bouton1:(id)sender { 

UIImage *buttonImageOn = [UIImage imageNamed:@"fond-footer-motif-rollover.png"]; 
UIImage *buttonImageOff = [UIImage imageNamed:@"fond-footer-motif.png"]; 
[sender setBackgroundImage:buttonImageOn forState:UIControlStateNormal]; 

[_button2 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button3 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button4 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button5 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button6 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button7 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button8 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button9 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button10 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button11 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button12 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button13 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button14 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button15 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button16 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button17 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button18 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button19 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button20 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button21 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button22 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button23 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button24 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button25 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button26 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button27 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button28 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button29 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button30 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button31 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button32 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button33 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button34 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button35 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button36 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button37 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button38 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button39 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button40 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
} 

- (IBAction)Bouton2:(id)sender { 

UIImage *buttonImageOn = [UIImage imageNamed:@"fond-footer-motif-rollover.png"]; 
UIImage *buttonImageOff = [UIImage imageNamed:@"fond-footer-motif.png"]; 
[sender setBackgroundImage:buttonImageOn forState:UIControlStateNormal]; 

[_button1 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
//[_button2 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button3 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button4 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button5 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button6 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button7 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button8 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button9 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button10 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button11 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button12 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button13 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button14 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button15 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button16 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button17 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button18 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button19 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button20 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button21 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button22 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button23 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button24 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button25 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button26 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button27 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button28 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button29 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button30 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button31 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button32 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button33 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button34 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button35 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button36 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button37 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button38 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button39 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
[_button40 setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
} 

所以,当我点击一个按钮,它改变所有的人..我怎样才能写出更好的代码?

+1

1)将所有的按钮放在数组中。 2)只调用一个ibaction并循环按钮,使用发件人参数来检测唯一的按钮,其行为会比其他人...我想这会更好... –

+2

如果我明白这个问题,这听起来像一份工作为UITableView而不是UIScrollView – mttrb

+0

让UITableView滚动水平的好运;-) –

回答

2

首先,可以将所有的按钮连接到同一个IBAction,这样你就不会需要40次写操作。为了简化它,你甚至可以做得更多。像这样:

您可以将所有按钮连接到IBOutletCollection比方说,我们把它称为allButtons这是一个NSArray的修改这样的代码:

- (IBAction)buttonTouched:(id)sender { 

    UIImage *buttonImageOn = [UIImage imageNamed:@"fond-footer-motif-rollover.png"]; 
    UIImage *buttonImageOff = [UIImage imageNamed:@"fond-footer-motif.png"]; 


    for (UIButton *button in self.allButtons) 
    { 
     [button setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
    } 

    [sender setBackgroundImage:buttonImageOn forState:UIControlStateNormal]; 
} 
+0

+1提醒我,我想添加IBOutletCollection到我的一个项目。 –

+0

这是完美的!我只是测试它,它工作正常!我学会了如何使用IBOutletCollection,这是一个很大的节省时间!谢谢你Tobi! – hhd59

+0

不客气:) – Tobi

0

我会给每个按钮一个标签。按键1获取标签1(如果您想使用零个索引标签使用10000至100039不使用标签0!),按钮数量40获得片40

- (void)configureViewForActivatedButtonNumber:(NSInteger)activeButtonNumber { 
    UIImage *buttonImageOn = [UIImage imageNamed:@"fond-footer-motif-rollover.png"]; 
    UIImage *buttonImageOff = [UIImage imageNamed:@"fond-footer-motif.png"]; 
    for (NSInteger i = 1; i <= 40; i++) { 
     UIButton *button = [self.scrollView viewWithTag:i]; 
     if (i != activeButtonNumber) { 
      [button setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
     } 
     else { 
      [button setBackgroundImage:buttonImageOn forState:UIControlStateNormal]; 
     }  
    } 
} 

- (IBAction)buttonPressed:(UIButton *)sender { 
    NSInteger buttonTag = sender.tag; 
    [self configureViewForActivatedButtonNumber:buttonTag]; 
} 
+0

我没有想到标签号码,这是相当优雅的......但是当你使用其他对象的标签时,它不会是混乱的吗?例如,当需要添加新按钮时,您需要预留一系列标签以防止在10041处有对象。 –

0

把项目中的数组。然后,您可以遍历每个项目并设置背景图像。

所有的
UIImage *buttonImageOn = [UIImage imageNamed:@"fond-footer-motif-rollover.png"]; 
UIImage *buttonImageOff = [UIImage imageNamed:@"fond-footer-motif.png"]; 

NSArray *buttons = @[sender, _button2, _button3, _button4, _button5, _button6, _button7]; 
for (UIButton *button in buttons) { 
    [button setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
} 
+0

他仍然会有40个ibactions ... –

+0

是的,他会的。但我觉得它更有前途证明。并使您的代码更具可读性。 –

+0

每种利弊都有很多方法。 –

1

您可以定义一个数组来存储按钮:

@property (strong, nonatomic) NSMutableArray *buttons; 

然后初始化所述阵列和存储按钮它动态:

self.buttons = [[NSMutableArray alloc] init]; 
for (int i = 0; i < 40; i++) { 
    // ... 
    Button *button = [[Button alloc] initWithFrame:frame]; 
    button.tag = i; 
    [self.buttons addObject:button]; 
} 

稍后,可以由标签访问任何按钮(指数):

int index = 25; 
Button *button = [self.buttons objectAtIndex:index]; 

在按钮tag告诉按钮被用户单击的,例如,当你钩手势识别或触摸事件发送到按钮。

+0

迄今为止只有理智的解决方案。 +1。 – 2012-11-02 08:17:59

0

这里是我的版本:

for (id subview in self.view.subviews) { 
    if ([subview isKindOfClass:[UIButton class]]) { 
     [(UIButton *)subview setBackgroundImage:buttonImageOff forState:UIControlStateNormal]; 
    } 
} 

当然你如果检查内循环最有可能需要一些其他的。您可以决定为视图上的所有按钮设置一些编号的标签ID。您可以在Interface Builder中轻松完成此操作,方法是选择所有按钮,然后在其中设置标签。

这个版本相当快,可以运行