2011-07-06 70 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