2011-07-06 9 views
1

基本的に私のView ControllerにはCircleViewという012の異なるインスタンス変数(circleView1circleView2、...、circleView49)があります。 CircleViewクラスは、UIImageViewという単純なサブクラスであり、基本的に初期化されたときに円のピクチャを返します。ここで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を再設計を検討してください;これは維持するのが非常に難しく、確かにそれを行うためのより良い方法があります(サークルビューがインデックスでアクセスされる配列が私の最初の選択です)。

+0

それはかなり意味があります、私は[self setValue:forKey:]をすでに考えていましたが、これは私が必要としていたものでした!本当にありがとうございます –

+0

実際には、それはプロパティまたはアクセサメソッドなしで定義されたivarでうまく動作します。そして、はい、これは再建築のようなにおいがします。 – bbum

+0

@bbumそれはKVCの意図された使用で、直接ivarsにアクセスしていますか?それは 'willAccessValue' /' didAccessValue'配管を迂回するようです。 – RyanR

3

変数の山があり、文字列でアクセスしようとする代わりに、配列(プリミティブC配列またはNSArray:NSMutableArrayでデモします)を使用します。 circleViewNインスタンスのように、クラス内にNSMutableArray *circleViews;を宣言してください。そして、あなたが[circleViews objectAtIndex:i];とあなたのランダムなint型iと希望円にアクセスすることができます

circleViews = [NSMutableArray arrayWithCapacity:50]; 

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

:あなたの初期化では、代わりにcircleViewN = [[CircleView alloc] init];の束の、あなたのような何かを持っていると思います。

+0

これは全体的にずっと良い解決策です。 – bbum

+0

@CajunLuke:ここではメモリが漏れています。配列に追加する際に、CircleViewオブジェクトを自動リースする必要があります。 –

+0

@Sedate True。私はそれを忘れて仕事をしていたので、ずっとJavaをやってきました。 – CajunLuke

関連する問題