2010-01-05 6 views
0

Je suis relativement nouveau à l'objectif C et j'ai besoin de l'aide de tableau.Récupérer NSNumber à partir d'un tableau

J'ai un plist qui contient un dictionnaire et un tableau NSNumber, avec plus de tableaux à être ajouté plus tard.

NSMutableDictionary *mainArray = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath]; 

NSArray *scoresArray = [mainArray objectForKey:@"scores"]; 

J'ai besoin de récupérer toutes les valeurs du tableau et les connecter à 10 UILabels qui j'ai mis en place dans le constructeur d'interface. J'ai fait ce qui suit pour transtyper NSNumber en String. Cela semble une approche très longue et sinueuse, je devrais répéter les quatre lignes ci-dessus dix fois pour récupérer toutes les valeurs de tableau. Puis-je utiliser une boucle for pour parcourir le tableau avec toutes les valeurs converties en chaînes à la sortie?

Toute information serait grandement appréciée.

Répondre

2
// create NSMutableArray* of score UILabel items, called "scoreLabels" 
NSMutableArray *scoreLabels = [NSMutableArray arrayWithCapacity:10]; 
[scoreLabels addObject:scoreLabel1]; 
[scoreLabels addObject:scoreLabel2]; 
// ... 

NSUInteger _index = 0; 
for (NSNumber *_number in scoresArray) { 
    UILabel *_label = [scoreLabels objectAtIndex:_index]; 
    _label.text = [NSString stringWithFormat:@"%d", [_number intValue]]; 
    _index++; 
} 

EDIT

Je ne suis pas sûr pourquoi vous voulez commenter _index++. Je n'ai pas testé ce code, alors peut-être qu'il me manque quelque chose quelque part. Mais je ne vois rien de mal avec _index++ - c'est une façon assez standard d'incrémenter un compteur.

Comme alternative à la création du tableau scoreLabels, vous pourriez en effet récupérer la propriété tag des sous-vues du contrôleur de vue (dans ce cas, UILabel instances que vous ajoutez une valeur tag dans Interface Builder).

En supposant que la valeur tag est prévisible - par exemple, chaque UILabel de scoreLabel1 par scoreLabel10 est marqué avec un tag égale aux valeurs de _index que nous utilisons dans la boucle for (0 à 9) - on peut alors faire référence à la UILabel directement:

// no need to create the NSMutableArray* scoreLabels here 
NSUInteger _index = 0; 
for (NSNumber *_number in scoresArray) { 
    UILabel *_label = (UILabel *)[self.view viewWithTag:_index]; 
    _label.text = [NSString stringWithFormat:@"%d", [_number intValue]]; 
    _index++; 
} 

la clé de ce travail est que la valeur tag doit être unique pour le UILabel et doit être quelque chose que vous pouvez faire référence avec -viewWithTag:.

Le code ci-dessus suppose très simplement que les valeurs tag sont les mêmes que les valeurs _index, mais cela n'est pas obligatoire. (Il suppose également les UILabel instances sont subviews de view propriété, du contrôleur de vue qui dépendra de la façon dont vous configurez votre interface dans Interface Builder.)

Certaines personnes écrivent des fonctions qui ajoutent 1000 ou un autre entier qui vous permet groupe types de sous-vues ensemble - UILabel instances obtiennent 1000, 1001, et ainsi de suite, et UIButton instances obtiendraient 2000, 2001, etc.

+1

Vous pouvez même vous débarrasser du tableau scoreLabels si des tags ont été ajoutés aux objets UILabel dans Interface Builder et viewWithTag: a été utilisé pour les récupérer. – gerry3

+0

Merci Alex. Cela ne construit que si je commente le _index ++. Ensuite, il renvoie le nombre final dans le tableau à l'étiquette définie à [scoreLabels addObject: scoreLabel1]; – user244295

+0

Vous avez ce travail en utilisant -viewWithTag, Cheers pour l'info. – user244295

0

essayer d'utiliser stringValue ...

scoreLabel1.text = [(NSNumber *)[scoresArray objectAtIndex:0] stringValue]; 
+0

Merci George. Cela fonctionne bien. Je voulais voir si je pouvais réduire le nombre de lignes. L'utilisation de ce qui précède nécessiterait toujours 10 lignes. scoreLabel1.text = [(NSNumber *) [scoresArray objectAtIndex: 0] stringValue]; scoreLabel2.text = [(NSnumber *) [scoresArray objectAtIndex: 1] stringValue]; ect ..... – user244295

+0

Voir ci-dessous pour un extrait de code plus court. –

+0

Oh je vois, n'a pas réalisé le problème était que vous deviez répéter le code pour la quantité d'éléments dans le tableau. Je pensais juste que vous aviez besoin d'un seul crayon pour définir le texte UILabel à partir de la valeur du tableau. La solution d'Alex est bonne. – George

Questions connexes