2011-07-06 34 views
1

基本上,我的视图控制器有49个不同的类CircleView(称为circleView1circleView2circleView2,...,circleView49)的实例变量。 CircleView类是UIImageView的简单子类,基本上在初始化时返回一个圆形图片。从Objective-C调用属性/实例变量Objective-C

这里就是我想要做:

我在执行的视图控制器,我希望能够选择使用字符串实例变量,例如假设我生成之间的随机整数i 1和49,可以说它是5.我希望能够使用类似[NSString stringWithFormat @"circleView%i",i];的东西来构建NSString,并以某种方式实现实际的circleView5实例变量。这可能吗?

P.S.我正在寻找一些符合NSClassFromString的行,但适用于实例变量或对象。

回答

5

KVC是你的朋友。假设你已经在它的circleView的名称的字符串,

NSString *myCircle = [NSString stringWithFormat:@"circleView%i", i]; 

您访问使用KVC控制器上的属性:

CircleView *theCircle = [self valueForKey:myCircle]; 

在一个侧面说明,你应该考虑重新设计对象heirarchary ;这将是非常难以维护的,并且确实有更好的方法来做到这一点(通过索引访问CircleView的数组将是我的首选)。

+0

这使得很多的意义,我已经认为[self setValue:forKey:]已经但这是我所需要的!非常感谢你 –

+0

实际上,它可以在没有属性或存取方法的情况下定义伊娃。而且,是的,这听起来像重新架构是为了。 – bbum

+0

@bbum KVC的使用目的是直接访问ivars吗?这似乎会绕过'willAccessValue' /'didAccessValue'管道。 – RyanR

3

而不是有一堆变量,并尝试通过字符串访问它们,使用一个数组(原始C数组或NSArray:我将演示一个NSMutableArray)。在你的班级中声明一个NSMutableArray *circleViews;,就像你做了circleViewN实例一样。在你的初始化,而不是一堆circleViewN = [[CircleView alloc] init];的,你有这样的:

circleViews = [NSMutableArray arrayWithCapacity:50]; 

for(int i=0; i<50; i++) 
    [circleViews addObject:[[[CircleView alloc] init] autorelease]]; 

然后你可以用随机INT i访问所需的圆圈[circleViews objectAtIndex:i];

+0

这是一个更好的解决方案。 – bbum

+0

@CajunLuke:你在这里泄漏内存,你应该在将它们添加到数组时自动释放你的'CircleView'对象。 –

+0

@Sedate True。我一直在做这么多的Java工作,我忘记了这一点。 – CajunLuke