2010-12-05 45 views
0

Je veux remplacer:Pointe d'objectif C?

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"]; 

Avec une boucle for .. Je ne sais pas comment appeler les Ivars un après l'autre dans une boucle ..

S'il vous plaît noter que les mettre dans un tableau avant la boucle est une bonne idée que je n'ai pas réussi à mettre en œuvre ..

Merci!

+1

Désolé que mal initiale réponse - La façon réelle de le faire est avec le codage de valeur de clé. Voir ma réponse pour un guide, et un exemple. –

Répondre

6

Une excellente façon de faire cela implique key value coding, comme discuté dans this blog post. Essayez d'utiliser:

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]; 

(Vous devez remplacer UIImage dans mon code ci-dessus avec le type d'objet réel, si j'ai eu tort.)

+0

Cela ne modifiera pas les variables de l'image d'origine, car 'name' est juste un pointeur local de la boucle qui sera changé en un' UIImage' complètement différent. Au lieu de cela, vous avez besoin d'un moyen d'avoir des pointeurs vers les variables d'instance d'origine. –

+0

Juste changé ma réponse à quelque chose d'un peu plus respectable. Désolé pour ça, c'était définitivement faux, au départ. –

+0

Le code fourni va maintenant fonctionner. – Chuck

1

Un collègue de travail de la mine aime d'un modèle comme celui-ci (non testé):

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]; 
} 

Vous devez vous demander si le coût de la lisibilité vaut juste pour en faire un petit peu plus extensible, cependant.

+0

yeesh ... je recommanderais * agains * en utilisant ceci, car cela finit comme un accès ivar direct, qui contourne les méthodes setter (qui peuvent déclencher des méthodes KVO ou du code personnalisé) –

3

Vous pouvez utiliser la syntaxe de codage valeur clé:

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]; 
} 
1

Une autre chose que vous pouvez faire cela est généralement assez rapide est d'allouer vos images sur la demande plutôt que d'essayer et de les initialiser à la fois. Nommez quelque chose comme « FirstViewBG_Fajer.png », puis d'écrire une méthode d'instance comme:

- (UIImage *) imageNamed:(NSString *) name { 
    return [UIImage imageNamed: [NSString stringWithFormat: 
    @"FirstViewBG_%@.png", name]]; 
}