【问题标题】:access objective-c object by string name or variable通过字符串名称或变量访问objective-c对象
【发布时间】:2012-05-02 22:24:06
【问题描述】:

我一直在环顾四周,并没有完全找到任何关于这样做的东西,并且不确定它是否可能,但这就是我想要实现的目标。请注意,我给出了一个非常简单的例子来说明我正在尝试做的事情。此外,发布的代码的相似之处都是假设的,并不意味着更正代码语法。它只是为了通过引用类似类型的功能来帮助进一步说明所需的最终结果。所以请在提供替代方法之前了解这个概念......

话虽如此,正如标题所说,我想看看我是否可以访问一个对象,让我们通过它的字符串名称说一个 uilabel,或者使用 if 语句不说一个变量。例如,假设我们有 3 个 uilabes

UILabel *label1;
UILabel *label2;
UILabel *label3;

从那里我们进行所有适当的合成以及不做的事情。现在在某个时候我想引用一个基于 let say 和 int 的标签。

int intNumber = 2;

这里是理论部分。我现在想设置名称中具有匹配 int 值的标签的文本。

label(%i, intNumber).text = [NSString stringWithFormat:@"This is Label %i", intValue];

结果将是......

label2.text = @"This is Label 2";

如果 int 值为 1,则 label1 将被更改。或者如果是 3,那么 label3 会被改变,等等......

或者如果可以使用标签的字符串名称完成相同的过程。

int intValue = 1;

NSString *labelName;

然后在某个时候

labelName = [NSString stringWithFormat:@"label%i",intValue];

现在以某种方式通过引用“labelName”来设置 label1 的文本来调用它。如果有人可以提出建议或评论是否可以完成这样的事情,我们将不胜感激。我知道您可以通过字符串名称引用类和选择器,但我不确定对象?我不知道“valueForKey:”是否是我应该这样做的方式?

很抱歉这篇冗长的帖子,但我只是想确保我说明了我想做的事情。

【问题讨论】:

标签: objective-c


【解决方案1】:

如果案例只是索引字符串,您可能应该使用数组,否则您正在寻找自省(看看this question)。

【讨论】:

    【解决方案2】:

    我认为您需要将标签存储在 NSArray 中,然后您可以通过索引访问标签。

    另一种方法是使用 KVC 获取标签。

    【讨论】:

      【解决方案3】:

      对不起,伙计们,我终于弄清楚了。 “setValue:forKeyPath:”原来是我需要的。举个例子……

      example.h

      @property (strong, nonatomic) UILabel *label1;
      @property (strong, nonatomic) UILabel *label2;
      @property (strong, nonatomic) UILabel *label3;
      

      example.m

      @synthesize label1, label2, label3;
      
      - (void)someMethod:(int)labelVarInt {
      
      [self setValue:[NSString stringWithFormat:@"This is Label %i", labelVarInt] forKeyPath:[NSString stringWithFormat:@"label%i.text", labelVarInt]];
      
      }
      

      希望这可以帮助其他需要做类似事情的人。

      【讨论】:

      • 呵呵 :) 这就是 KVC 的关键值编码,你得到了答案!
      • 是的,我知道 kvc 和 kvo 是什么。我只是不确定采取的最佳方法。如果您注意到我什至在我的问题中提到了“valueForKey:”方法。效率是关键,一条线总是胜过 5-10。很多人都问过类似的问题,但没有人发布过这么简单的答案。
      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2022-07-22
      相关资源
      最近更新 更多