1

我是开发新手,有时我会编写一些非常奇怪的代码。例如,在这种情况下,我制作了一个滚动视图,用于显示从 1 到 40 的水平数字列表。每个数字都是一个按钮。我不希望当用户点击一个数字时,这个按钮的背景图像会改变,当他点击另一个时,新按钮的背景也会改变(但第一个按钮会回到他的初始状态)。就像在标签栏上...

为此,我编写了 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];
}

因此,当我单击一个按钮时,它会更改所有其他按钮.. 我怎样才能编写更好的代码?

4

5 回答 5

2

首先,您可以将所有按钮连接到相同的IBAction,因此您不需要编写 40 次动作。为了更简化它,你可以做某事。像这样:

您可以将所有按钮连接到IBOutletCollection假设我们称之为修改您的代码,如下所示allButtonsNSArray

- (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];
}
于 2012-11-02T08:05:18.290 回答
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];

in 按钮告诉用户单击了哪个按钮,tag例如,当您将手势识别器或触摸事件挂接到按钮时。

于 2012-11-02T08:07:00.707 回答
0

我会给每个按钮一个标签。按钮编号 1 获取标签 1(不要使用标签 0!。如果您想使用零索引标签,请使用 10000 到 100039),按钮编号 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];
}
于 2012-11-02T07:59:56.593 回答
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];
}
于 2012-11-02T08:01:12.970 回答
0

这是我的版本:

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

当然,如果在循环内部进行检查,您很可能需要其他一些东西。您可以决定为视图上的所有按钮设置一个数字的标签 ID。您可以在 Interface Builder 中轻松做到这一点,方法是选择所有按钮,然后在此处设置标签。

这个版本非常快并且有效

于 2012-11-02T08:22:11.307 回答