2010-12-05 12 views
0

私はこの置き換えたい:forループで目的C tip?

self.fajerImage  = [UIImage imageNamed:@"FirstViewBG_5N.png"]; 
self.shrogImage  = [UIImage imageNamed:@"FirstViewBG_4N.png"]; 
self.dohorImage  = [UIImage imageNamed:@"FirstViewBG_3N.png"]; 
self.aaserImage  = [UIImage imageNamed:@"FirstViewBG_2N.png"]; 
self.mgribImage  = [UIImage imageNamed:@"FirstViewBG_1N.png"]; 
self.eeshaImage  = [UIImage imageNamed:@"FirstViewBG_0N.png"]; 

を..私はループの中で次々アイバーズを呼び出す方法がわからない...

はANでそれらを置くことに注意してください配列の前にループを実装することに成功していないという素晴らしいアイデアです。

ありがとう!

+1

- これを行うには、実際の方法は、キー値コーディングです。ガイドと例については私の答えを見てください。 –

答えて

6

this blog postで説明されているように、これを行うには、key value codingが必要です。私の同僚は、以下のようなパターンが好きです

+0

'name'は完全に異なる' UIImage'に変更されるループのローカルなポインタなので、元の画像変数は変更されません。代わりに、元のインスタンス変数へのポインタを持つための何らかの方法が必要です。 –

+0

私の答えはもうちょっと変わった。申し訳ありませんが、当初は間違いでした。 –

+0

ここで与えられたコードが動作します。 – Chuck

1

NSArray *nameArray = [[NSArray alloc] initWithObjects:@"fajerImage", 
                @"shrogImage", 
                @"dohorImage", 
                @"aaserImage", 
                @"mgribImage", 
                @"eeshaImage", 
                nil]; 

int i = 0; 
for (NSString *name in nameArray) { 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"FirstViewBG_%dN.png", i++]]; 
    [self setValue:image forKey:name]; 
} 

[nameArray release]; 

(私はそれが間違って得ている場合は、実際のオブジェクト型を持つ上に自分のコードでUIImageを交換する必要があります。):使用してみてください(未テスト):

id *images[] = { 
    &eeshaImage, 
    &mgribImage, 
    &aaserImage, 
    &dohorImage, 
    &shrogImage, 
    &fajerImage 
}; 

for (size_t i = 0;i < sizeof(images)/sizeof(*images);++i) { 
    NSString *name = [NSString stringWithFormat:@"FirstViewBG_%zuN.png", i]; 
    *(images[i]) = [[UIImage imageNamed:name] retain]; 
} 

あなたは、読みやすさで、コストはしかし、それはほんの少しより拡張性にするために価値がある場合を自問する必要があります。

NSString *names=[NSArray arrayWithObjects:@"eeshaImage",@"mgribImage",@"aaserImage",@"dohorImage",...,nil]; 

for (int i=0; i<names.count; i++) { 
     NSString *name=[names objectAtIndex:i]; 
     UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"FirstViewBG_%dN.png",i 
     [self setValue:image forKey:name]; 
} 
+0

yeesh ...これはsetterメソッド(いくつかのKVOメソッドやカスタムコードをトリガしている可能性があります)をバイパスする直接ivarアクセス​​として終了するので、これを使用して* agains *をお勧めします。 –

3

あなたは、キー値コーディングの構文を使用することができます。彼らに「FirstViewBG_Fajer.png」のようなものに名前を付け、その後のようなインスタンスメソッドを記述します。

その最初の間違った答えについては申し訳ありません
- (UIImage *) imageNamed:(NSString *) name { 
    return [UIImage imageNamed: [NSString stringWithFormat: 
    @"FirstViewBG_%@.png", name]]; 
} 
1

もう一つは、あなたがそれが通常十分な速さで行うことができますが、オンデマンドであなたのイメージを割り当てるのではなく試してみて、一度にすべてを初期化です: