以编程方式更改多个按钮

时间:2015-03-06 20:23:00

标签: ios objective-c

我有一个包含10个按钮的视图,我想使用数组中的信息来设置有多少按钮可见以及它们的标题是什么。

按钮名为option1BTN ... option10BTN。该数组具有不同的数据和大小,具体取决于用户选择的内容,我希望按钮也能反映更改。

下面的代码显示了一个for-do循环,它设置了哪个按钮可见,按钮标题

for (int i=0; i == [optionsArray count]; i++) {

    self.option1BTN.hidden = NO;
    [self.option1BTN setTitle:[optionsArray objectAtIndex:i] forState:UIControlStateNormal];

}

如何在循环中更改按钮名称(以编程方式),以便根据数组的大小将其更改为option1BTN,然后更改为option2BTN ... optionXBTN,依此类推?

2 个答案:

答案 0 :(得分:2)

NSArray *buttons = @[self.option1BTN, self.option2BTN]; // add all the buttons here 

for (int i=0; i < buttons.count; i++) {
    UIButton *button = buttons[i];
    button.hidden = NO;
    [button setTitle:[optionsArray objectAtIndex:i] forState:UIControlStateNormal];

    // the previous line can be re-written as
    //[button setTitle:optionsArray[i] forState:UIControlStateNormal];
}

这种方法与使用IBOutletCollection之间的区别(正如Jeff在答案中所建议的那样)是插座集合不保证其项目的顺序。如果订单对您很重要,您需要自己指定,例如我上面的代码段。

答案 1 :(得分:0)

您有两个主要选项,一个是使用IBOutletCollection(如果您的按钮是在Interface Builder中创建的)。每个UIButton都将存储在集合中,您可以从集合中检索循环中的右键。

示例:

@property (nonatomic, strong) IBOutletCollection(UIButton) NSArray *buttons;

在IB中,您需要将每个按钮链接到IBOutletCollection。然后在您的代码中,您将能够:

for (int i = 0; i < optionsArray.count; i++) {
    UIButton *tempButton = self.buttons[i];
    tempButton.hidden = NO;
    [tempButton setTitle:[optionsArray objectAtIndex:i] forState:UIControlStateNormal];
    tempButton.hidden = NO;
}

IBOutletCollection的排序并不总是有保证,因此您可能需要使用IBOutletCollection和视图标记的组合(请参阅帖子末尾)。有关IBOutletCollection's的更多信息,请参阅NSHipster's article

第二个选项是,如果您的按钮是以编程方式创建的,请在创建时将每个按钮存储在NSMutableArray中:

@property (nonatomic, strong) NSMutableArray *buttons;

UIButton *myButton;
// Do something...

[self.buttons addObject:option1BTN];

然后使用与之前相同的循环。

第三个(不推荐的选项)是标记每个UIButton,然后您可以使用viewWithTag:方法检索按钮。例如。再次使用上面的代码,但得到按钮:

UIButton *tempButton = [self.view viewWithTag:i];