【问题标题】:Looping over similarly named UI elements - maybe by getting a variable from its name?循环遍历类似命名的 UI 元素 - 也许通过从其名称中获取变量?
【发布时间】:2012-02-20 13:22:34
【问题描述】:

我使用 Interface Builder 为视图添加了许多标签。我还有一组要显示的值。

有没有比使用这段代码更好的方法来设置标签:

lblTotal1.text = [NSString stringWithFormat: @"%i Seconds", (int) round(fTimeTotal[1])];
lblTotal2.text = [NSString stringWithFormat: @"%i Seconds", (int) round(fTimeTotal[2])];
lblTotal3.text = [NSString stringWithFormat: @"%i Seconds", (int) round(fTimeTotal[3])];
lblTotal4.text = [NSString stringWithFormat: @"%i Seconds", (int) round(fTimeTotal[4])];

我想做的是这样的:

for (int i = 1; i<5; i++) {
    lblTotal[i].text = [NSString stringWithFormat: @"%i Seconds", (int) round(fTimeTotal[i])];
}

但我必须能够从变量名中获取变量。我该怎么做?

【问题讨论】:

  • 使用 nsstring stringfromclass 使用变量形成类名.. 希望帮助将在升技添加更详细的注释
  • stackoverflow.com/questions/2951828/… 这是一个很好的答案。欢呼
  • Josh,您提到的问题听起来与我的问题相似,但不适用于我在集合中获取一堆 UI 元素的问题。我已更改问题的标题以反映我的意图。

标签: objective-c cocoa


【解决方案1】:

您可以将我们的 IBOutlet 连接到 IB 中的 IBOutletCollection 中(选择一组并将它们一起拖到源代码中;它应该提供创建一个集合)。虽然 IBOutletCollection 在技术上是一个有序列表(数组),但实际上它是随机排序的。

一旦您将所有 IBOutlet 连接到一个 IBOutletCollection 中,您仍然需要知道哪个是哪个。您可以使用tag 执行此操作,这是您可以在 IB 中设置的字段之一。将它们全部标记后,您的代码将是:

for (UILabel *label in self.labelCollection) {
  int value = (int)roundf(fTimeTotal[label.tag]);
  label.text = [NSString stringWithFormat:@"%i Seconds", value];
}

【讨论】:

    【解决方案2】:

    如果你像lblTotal1这样的变量是属性,你可以使用键值编码(KVC)来获取它们:

    NSUInteger lblIndex = 1;
    NSString *lblName = @[NSString stringWithFormat: @"lblTotal%d", lblIndex];
    
    id label = [self valueForKey: lblName];
    

    根据您是针对 iOS 还是 OS X,最后一行中的 id 当然可以是您标签的任何特定类。

    【讨论】:

    • 它们是否是属性实际上并不重要。只要有一个叫-labelTotal1的方法,上面的都是正确的。请注意,如果lblName 没有命名方法,那么上面会崩溃,所以要小心。
    【解决方案3】:

    你可以使用 self.view.subviews 数组来遍历所有子视图并检查它是否是 UILabel,做你的事情。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多