2009-07-21 7 views
0

Je suis actuellement la construction d'une application iPhone qui affichera des données à partir d'un NSMutableArray appelé "histoires". La structure du tableau ressemble donc (via NSLog):UITableView Looping Out Données de NSMutableArray/NSDictionary

2009-07-20 12:38:30.541 testapp[4797:20b] (
    { 
    link = "http://www.testing.com"; 
    message = "testing"; 
    username = "test"; 
}, 
    { 
    link = "http://www.testing2.com"; 
    message = "testing2"; 
    username = "test2"; 
}) 

Mon cellForRowAtIndexPath ressemble à ce moment:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 


} 

    for (NSDictionary *story in stories) { 
     [cell setTextColor:[UIColor whiteColor]]; 
     [cell setFont: [UIFont systemFontOfSize:11]]; 
     cell.text = [NSString stringWithFormat:[story objectForKey:@"message"]]; 
    } 
      return cell; 
} 

Actuellement, mon UITableView affiche plusieurs entrées de l'élément même (qui se trouve être le dernier set dans le tableau). Comment puis-je l'obtenir pour boucler avec succès le tableau et afficher le message de l'élément suivant dans les cellules les unes après les autres.

Merci à l'avance :)

Benji

Répondre

5

Vous ne comprenez pas comment la méthode cellForRowAtIndexPath: fonctionne.

De la façon dont vous l'avez, vous créez une cellule unique, puis vous réinitialisez plusieurs fois ses propriétés text, textColor et de police, puis renvoyez une seule cellule.

La clé pour comprendre votre problème est de comprendre que cellForRowAtIndexPath: s'appelle plusieurs fois, une fois pour chaque cellule qui sera affichée à l'écran.Ainsi, au lieu de votre boucle(), faites ceci:

NSDictionary * story = [stories objectAtIndex:[indexPath row]]; 
[cell setTextColor:[UIColor whiteColor]]; 
[cell setFont: [UIFont systemFontOfSize:11]]; 
cell.text = [NSString stringWithFormat:[story objectForKey:@"message"]]; 

Le paramètre indexPath étant transmis est comment le tableView indique dans quelle cellule il est vous demander. Nous utilisons cela pour récupérer le dictionnaire d'histoire correspondant à partir de votre tableau.

EDIT:

Je voudrais aussi souligner que ce code n'est pas compatible iPhone OS 3.0. Le SDK 3.0 a introduit des modifications dans la façon dont UITableViewCell fonctionne, y compris sa hiérarchie de vue. Vous voulez sans doute être l'accès au Textlabel de la cellule, puis définir les propriétés de qui, comme ceci:

NSDictionary * story = [stories objectAtIndex:[indexPath row]]; 
[[cell textLabel] setTextColor:[UIColor whiteColor]]; 
[[cell textLabel] setFont: [UIFont systemFontOfSize:11]]; 
[[cell textLabel] setText:[NSString stringWithFormat:[story objectForKey:@"message"]]]; 
+0

Salut Dave, Merci pour la poste utile et point de compatibilité 3.0, pour une raison quelconque, il semble s'écraser pour moi avec l'erreur: "*** App terminant en raison de l'exception uncaught 'NSRangeException', raison: '** * - [NSCFArray objectAtIndex:]: index (2) au-delà des limites (2) '" Merci encore. –

+1

@Benji cela signifie que vous n'avez que 2 éléments dans votre tableau, mais le tableauView en demande un troisième. Assurez-vous que vous renvoyez [nombre d'articles] dans votre méthode de délégué numberOfRowsInSection. Si tel est le cas, assurez-vous que vous ne mutez pas le NSArray dans les coulisses et que vous ajoutez/supprimez des éléments sans le dire à la tableview (vous le dites en lui envoyant le message reloadData). –

+0

Dave vous êtes un génie, je ne l'avais pas retourné [les histoires comptent]. Merci encore et bonne journée :) –

0

Il n'y a pas besoin d'avoir une boucle ici - ce que vous voulez faire est d'utiliser l'indice de la cellule de table et obtenir l'élément correspondant de votre choix (on ne sait pas, utilisez-vous un tableau ou un dictionnaire?). Ainsi, par exemple, le quatrième élément de votre tableau serait placé dans la quatrième cellule du tableau.

Voici le correctif:

NSDictionary *story = [stories objectAtIndex: indexPath.row]; 
cell.text=[NSString stringwithFormat:[story [email protected]"message]; 
0

Votre problème est ici ce

for (NSDictionary *story in stories) {  

[SetTextColor cellulaire: [UIColor whiteColor]];
[cellule setFont: [UIFont systemFontOfSize: 11]];
cell.text = [NSString stringWithFormat: [histoire objectForKey: @ "message"]];
}

Vous configurez vos cellules pour afficher toujours la dernière histoire, ce que vous voulez faire quelque chose comme

NSDictionary *story = [stories objectAtIndex: indexPath.row]; 
cell.text=[NSString stringwithFormat:[story [email protected]"message]; 
0

au lieu de

for (NSDictionary *story in stories) { 
    cell.text = [NSString stringWithFormat:[story objectForKey:@"message"]]; 
} 

vous voulez

int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1]; 
cell.text = [NSString stringWithFormat:[[stories objectAtIndex: storyIndex] objectForKey:@"message"]]; 

votre méthode cellForRowAtIndexPath sera appelée onc e pour chaque cellule, vous ne voulez donc que définir le texte pour cette cellule particulière.

Notez que pour une table simple sans section, un "chemin d'index" finit par être juste un tableau avec un nombre entier.

+0

ce qui est avec le storyIndex int? –

+0

coupable de copier le code du mauvais exemple de quelqu'un d'autre il y a un mois quand je ne comprenais pas vraiment ce qu'indexPaths sont et apparemment l'auteur ne connaissait pas les méthodes "row" et "section" spécifiques à l'iPhone .... –