通过字符串名称调用对象,其中字符串是动态构建的

时间:2014-08-26 19:07:56

标签: ios objective-c xcode for-loop

对于我的iOS应用程序,我创建了一个名为Tile的类,它是UIImageView的子类。

图块显示为一种包含6行和5列的数组。 我之前创建了30个Tile类的实例。这些实例都以这种方式命名:RiCj其中i是行号,j是列号。

我想创建一个for循环,我会对每个tile应用特定的处理(基本上,我想显示tilesTile是Tile类的实例方法的tile。)

我很想做(我知道下面的代码不正确):

for (int i = 1; i <= numberOfRows ; j++) {
  for (int j = 1; j <= numberOfColumns ; j++) {
     [self.RiCj displayTile];
  }
}

我不知道如何根据动态字符串标题调用我的图块。

3 个答案:

答案 0 :(得分:0)

是的,您可以通过创建一个命名该属性的字符串,然后使用KVC来实际访问类的属性,如下所示:

NSString *propertyName = [NSString stringWithFormat:@"R%dC%d", i, j]; 
tile = [self valueForKey:propertyName];

但是你呢? 不,不是在这种情况下。当制作数组(或数组数组)的完美替代方案可用时,这是一个可怕的黑客。

以下是数组创建和访问的数组(通过为数组使用方便的Objective C文字):

NSArray *tiles = @[
                    @[ tile0C0, tile0C1, tile0C2 ],
                    @[ tile1C0, tile1C1, tile1C2 ],
                    @[ tile2C0, tile2C1, tile2C2 ],
                 ];

for (int i = 0; i < numberOfRows ; j++) {
    for (int j = 0; j < numberOfColumns ; j++) {
        tile = tiles[j][i];
        // do stuff with tile
    }
}

答案 1 :(得分:0)

是的,从技术上讲,这是可能的 - 您可以像这样使用Key-Value Coding

for (int i = 1; i <= numberOfRows; i++) {
  for (int j = 1; j <= numberOfColumns; j++) {
    NSString* tileName = [NSString stringWithFormat:@"R%dC%d", i, j]; 
    [[self valueForKey:tileName] displayTile];
  }
} 

但你不应该。它不会是一个干净的解决方案。数组是一个更自然的选择。

答案 2 :(得分:-2)

如果我理解正确,您将尝试动态地通过变量名访问实例。你不能这样做,因为你的变量名是为程序员设计的,并且在运行时不可用。

但是,您可以做的是将创建的实例列表保存在某个数组中,并在需要访问它时简单地遍历该数组。

或者,如果您将30个图块创建为30个不同的属性,则可以使用一些动态代码来获取它们。但是,在那时,我强烈建议使用数组技术。