通过字符串名称或变量访问objective-c对象

时间:2012-04-21 17:34:32

标签: objective-c

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

据说,正如标题所说,我试图看看我是否可以访问一个对象,让我们通过其字符串名称或变量使用if语句不用来表示uilabel。例如,假设我们有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,则标签3将被更改,等等......

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

int intValue = 1;

NSString *labelName;

然后在某个时候

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

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

对不起啰嗦的帖子感到抱歉,但我只是想确定我说出了我想做的事情。

3 个答案:

答案 0 :(得分:7)

对不起男人&加尔斯,我最终搞清楚这一点。结果是“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]];

}

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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