【问题标题】:Make changes to a number of buttons programatically以编程方式更改多个按钮
【发布时间】:2015-03-06 20:22:59
【问题描述】:

我有一个包含 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 等等?

【问题讨论】:

  • 听起来你想使用 UICollectionView
  • 您保留一组按钮 optionButtons。然后在循环中使用 optionButtons[i] 访问它们。这就是你要找的吗?

标签: ios objective-c


【解决方案1】:
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 在他的回答中所建议的那样)之间的区别在于,出口集合不保证其项目的顺序。如果顺序对你很重要,你需要自己指定,就像我上面的代码 sn-p 一样。

【讨论】:

  • 实际上再看一遍,我不确定它是否真的做了我需要它做的事情......这是每次都创建一个新按钮吗?我想每次都使用相同的 10 个按钮,因为按钮具有它们需要运行的代码。一旦我设置了“按钮”的值,我是否会将它们放回数组中?值在什么时候显示?
  • 你试过了吗?这不是创建任何新按钮。循环内发生的事情是您按顺序浏览按钮。对于您说的每个按钮,好吧,现在我将使用按钮 #1 并将其命名为 button。您为该按钮设置标题和隐藏属性。对您的每个按钮都重复此操作。如果您的按钮在屏幕上,更改将立即可见。
  • 我刚刚又跑了一遍,现在它可以工作了!大声笑抱歉,第一次不确定问题是什么。再次感谢!
【解决方案2】:

您有两个主要选择,一个是使用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];

【讨论】:

  • 谢谢,这个答案也很棒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2011-03-07
  • 2015-10-03
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多