2010-07-12 13 views
1

J'ai un problème avec mon code en sautant le if (cell == nil) après environ neuf voyages à travers le cellForRowAtIndexPath. Ensuite, les éléments de ma table commencent à se répéter et tous les neuf éléments le font. Quand je supprime la ligne if (cell == nil), la table ressort magnifiquement, avec toutes les données dans le bon ordre. Cependant, si je fais défiler vers le bas de la table, mon application plante, ce qui n'est pas une bonne solution. Des idées s'il vous plaît ??Les TableViewCells répétées s'affichent lorsque j'essaie de réutiliser les viewviewcells ... comment puis-je les afficher?

Merci!

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


    if (cell == nil) { 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];  


    NSString *temp = [[views objectAtIndex:indexPath.row] objectForKey:@"racer"]; 
    NSString *val = [[views objectAtIndex:indexPath.row] objectForKey:@"pointsScored"]; 

    // Set up the cell... 
    cell.textLabel.text = temp; 
    cell.textLabel.font = [UIFont boldSystemFontOfSize:15]; 
    cell.detailTextLabel.text = val; 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    [temp release]; 
    [val release]; 

    } 

    return cell; 
} 

Répondre

0

KLevSki,

C'est parce que vous réutilisez les cellules Tableview via dequeueReusableCellWithIdentifier qui est une bonne chose sur la plate-forme iPhone. Ce qui se passe est le suivant:

1) Cell est créé dans la section if (cell==nil)

2) Une fois un certain nombre de cellules sont créées (dans votre cas 9 d'entre eux, basé à peu près combien sont affichées à l'écran), le système d'exploitation commence à réutiliser les cellules du tableau pour être un bon gestionnaire de mémoire au lieu de créer une cellule de table unique pour chaque rangée qui pourrait être intensive en mémoire

3) Puisque la cellule est réutilisée, vous tous besoin de faire dans la section après le bloc if (cell==nil) est de mettre à jour/modifier les informations sur chaque cellule. Par exemple ... Si vous créiez une cellule qui ne comportait qu'une icône et une étiquette, chaque fois que la cellule défilerait dans la vue, vous mettriez à jour l'icône et l'étiquette à l'image/chaîne appropriée. cette cellule.

Pour votre cas:

... 

if (cell == nil) { 

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];  

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

} 

// update cell 
cell.textLabel.text = [[views objectAtIndex:indexPath.row] objectForKey:@"racer"]; 
cell.textLabel.font = [UIFont boldSystemFontOfSize:15]; 
cell.detailTextLabel.text = [[views objectAtIndex:indexPath.row] objectForKey:@"pointsScored"]; 

return cell; 
+0

Woah! Merci beaucoup! C'était le cas! Cependant, maintenant quand je l'exécute et défile vers le bas, j'obtiens cette erreur: 2010-07-12 15: 48: 05.753 TabTabTab [25374: 20b] *** - [UICGColor isEqualToString:]: sélecteur non reconnu envoyé à l'instance 0x3d9edc0 2010-07-12 15: 48: 05.755 TabTabTab [25374: 20b] *** Terminaison de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '*** - [UICGColor isEqualToString:]: sélecteur non reconnu envoyé à l'instance 0x3d9edc0' Des idées? – Rossi

+0

Never Mind! J'ai enlevé les lignes de lancement et les choses vont bien! Je vous remercie beaucoup pour votre aide. Je l'apprécie vraiment – Rossi

+0

Pas un problème, mais s'il vous plaît voir mon post mis à jour. Vous ne pouvez pas simplement supprimer les lignes 'release' ou vous fuir ces objets puisqu'ils ne seront jamais libérés. Au lieu de cela, il suffit de se débarrasser d'eux puisque vous n'en avez pas besoin de toute façon (voir mon code). S'il vous plaît marquer également cette question en réponse en cliquant sur le "case à cocher" à côté de lui – iwasrobbed