使用表示变量名称的String来设置变量

时间:2011-04-15 17:27:51

标签: objective-c variables indexing nsstring

这是一个我知道可以简化的基本示例,但为了测试,我想以这种方式执行此操作。我想根据附加字符串设置变量(变量“cam0”和“pos1”已在类中声明)。附加字符串本质上是一个索引,我将迭代循环以将摄像机(cam0,cam1 ..)分配到不同的位置(pos0,pos1 ..)。

cam0定义为UIImageView
pos1被定义为CGRect

这适用于名为coverIndex的NSString变量:

NSString* text = [[NSString alloc] initWithString:@""];
NSLog(@"%@",(NSString *)[self performSelector:NSSelectorFromString([text stringByAppendingString:@"coverIndex"])]);

我为coverIndex设置的正确字符串已记录到控制台。

现在回到我的UIImageView和CGRect。我想要这个。

NSString* camText = [[NSString alloc] initWithString:@"cam"];
NSString* posText = [[NSString alloc] initWithString:@"pos"];

[(UIImageView *)[self performSelector:NSSelectorFromString([camText stringByAppendingString:@"0"])] setFrame:(CGRect)[self performSelector:NSSelectorFromString([posText stringByAppendingString:@"1"])]];

我的错误是“转换为请求的非标量类型”

这是我发现做这种事情的唯一方法(并让NSLog工作),但我仍然相信有一种更简单的方法。

非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:4)

使用KVC,这是一项令人惊叹的技术,可以满足您的需求:

for (int index = 0; index < LIMIT; index++) {

    NSString *posName = [NSString stringWithFormat:@"pos%d", index];
    CGRect pos = [[self valueForKey:posName] CGRectValue];
    NSString *camName = [NSString stringWithFormat:@"cam%d", index];

    UIImageView *cam = [self valueForKey:camName];
    cam.frame = pos;
}

答案 1 :(得分:2)

您可以这样做的一种方法是在字典中创建相机并使用这些特殊的NSStrings来键入它。像,

NSMutableDictionary *myCams;
myCams = [[myCams alloc] init];
[myCams addObject:YOUR_CAM0_OBJECT_HERE forKey:@"cam[0]"];
[myCams addObject:YOUR_CAM1_OBJECT_HERE forKey:@"cam[1]"];

NSString camString = @"cam[0]"; // you'd build your string here like you do now
id theCamYouWant = [myCams objectForKey:camString];