【问题标题】:How to construct and use a name of variable? [duplicate]如何构造和使用变量名? [复制]
【发布时间】:2011-10-24 07:09:28
【问题描述】:

可能重复:
Objective-c create variables in a loop

我有 10 个 UILabel,为简单起见,将其设为 label0、label1、...、label9。现在,我正在实现一个循环,我需要从适当的循环循环中访问适当的标签:

for (int i=0; i<10; i++){
  label"i".text = "value of label i";
}   

我需要通过绑定循环循环变量值来构造变量名。有什么建议吗?

【问题讨论】:

标签: iphone objective-c ios variables


【解决方案1】:

据我所知,没有办法像您建议的那样执行此操作。但是,您可以使用UILabels 填充NSMutableArray,然后调用索引i 处的对象以检索ith 标签。

创建labelArray(动态或静态),然后你的for循环将是

for (int i=0; i<10; i++){
  [[labelArray objectAtIndex:i] setText:@"value of label i"];
}   

【讨论】:

    【解决方案2】:

    对于每个UILabel,您可以保留一个tagtagNSInteger

    所以它本质上可能是你的索引号本身......

    您可以通过在父 UIView 上调用 viewWithTag: 来访问标签。

    【讨论】:

    • 我知道也许有一个标签数组然后迭代会是更优雅的解决方案,但我已经结束了保存一些代码并使用你的建议 - 标签:)
    • 在下面查看我的新答案。有一种方法可以让你使用 NSClassFromString() 来做你想做的事
    【解决方案3】:

    如何创建一个包含这些标签的数组,并使用索引进行迭代?

    【讨论】:

      【解决方案4】:

      我今天刚遇到这个。这似乎是您正在寻找的原始优雅解决方案。它不需要任何标签或特殊的可变数组:

      for (int i=0; i<10; i++){
          ((UILabel *)NSClassFromString([NSString stringWithFormat:@"label%i", i])).text = @"value of label i";
      }
      

      【讨论】:

      • 有趣的方法,但是,我无法让它工作。我放了一个带有 2 行代码的 IBAction。行 "((UILabel *)NSClassFromString([NSString stringWithFormat:@"label%d", 1])).text = @"Value";"不是,而是 "self.label1.text = @"text";"工作中。我已经尝试过使用没有 ivar 的属性 label1 和使用没有属性的 ivar,但它仍然不起作用。
      • 今天我会整理一些测试代码,并将其推送到某个地方以供阅读。
      【解决方案5】:

      这是一个相当常见的用例。通常,这可以解决我使用NSMutableDictionary 维护字符串到对象的映射:

      NSMutableDictionary *labelMap = [[NSMutableDictionary alloc] initWithCapacity:10];
      [labelMap setObject:[[[UILabel alloc] init] autorelease] forKey:@"label1"];
      [labelMap setObject:[[[UILabel alloc] init] autorelease] forKey:@"label2"];
      [labelMap setObject:[[[UILabel alloc] init] autorelease] forKey:@"label3"];
      // etc

      那么当你想通过名字来引用一个对象时:

      for (int i=0; i<10; i++){ 
         NSString *labelKey = [NSString stringWithFormat:@"label%i", i];
         [labelMap objectForKey: labelKey].text = "value of label i";
      }
      

      【讨论】:

      • 如果这不使用 ARC,那么您在每个标签上都有额外的保留,并且可能会泄漏它们。
      • 是的。你是对的。大声笑——一旦你开始使用 ARC,就很容易摆脱内存管理。谢谢。
      • 这实际上并不能帮助 Centurion 使它更整洁。
      • 我不同意。 [labelMap objectForKey: @"label1"].text 尽可能简洁。即使他更喜欢更简单的东西——例如使用标签——这仍然是一个有效的选择。不知道你为什么会投反对票。
      • 应该有效作为标准吗?当然,它可以编译,但它绝对是可怕的代码。脆弱、冗长、低效。作为一种解决方案,它侧重于错误的事情(“如何将字符串和数字连接到标识符?”)与真正的问题(“如何将操作应用于一系列对象?”)。使用eval("label"+i) 技巧是任何语言的黑客攻击。
      猜你喜欢
      • 2014-12-14
      • 2019-09-30
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多