2009-03-26 8 views
2

J'ai un tableView qui doit être mis à jour après que l'information a été insérée à partir d'une autre vue. Si je joue uniPhone SDK: insertion et mise à jour d'un UITableView avec une nouvelle ligne

[self.tableView reloadData]; 

La très prochaine fois que j'insérer plus d'informations dans une autre vue et essayer de recharger la table, toutes les lignes actuellement visibles sont dupliqués.

En d'autres termes, quand je commence l'application que j'ai:

tableView: 
    Row 1 
    Row 2 

Puis-je envoyer des informations qui afficheront aussi dans la table et tout à coup je:

tableView 
    Row 1 
    Row 2 
    Row 3 <- info I just added 
    Row 1 
    Row 2 

Mon la mise en œuvre numberOfRowsInSection ressemble à ceci:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [ItemsController sharedItemsController].count; 
} 

Ma mise en œuvre de cellForRowAtIndexPath regards comme ceci:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ItemsController* controller = [ItemsController sharedItemsController]; 
    NSMutableArray* recentItems = controller.listOfRecentItems; 

    CustomCell *cell = nil; 
    NSUInteger row = [indexPath row]; 

    if(row < recentItems.count) 
    { 
     Items* item = [recentItems objectAtIndex:row]; 
     if(recentCellData == nil) 
      recentCellData = [[NSMutableDictionary alloc] initWithCapacity:[indexPath length]]; 

     if([recentCellData count] > 0) 
      cell = [recentCellData objectForKey:[NSString stringWithFormat:@"%d", row]]; 
     if (cell == nil) { 
      UIViewController * view1 = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil]; 

      cell = (CustomCell*)[view1 view]; 

      [recentCellData setObject:cell forKey:[NSString stringWithFormat:@"%d",row]]; 
     } 

     // do some other stuff here 
    } 
    // Set up the cell 
    return cell; 
} 

Quelle est la meilleure façon de mettre à jour la table et éviter de dupliquer les lignes actuellement visibles. Merci d'avance pour toute l'aide!

+0

Il semble que vous ayez besoin d'inclure l'implémentation de votre méthode tableView: numberOfRowsInSection: dans votre question. – dstnbrkr

+0

J'ai ajouté cette information aux questions. Merci! – Jeff

Répondre

3

L'erreur ne réside pas dans la façon dont vous rechargez la table, mais dans la manière dont vous lui fournissez des données. Définissez un point d'arrêt dans les méthodes de source de données et la méthode qui ajoute de nouvelles lignes pour voir où vous allez mal.

1

J'ai ajouté un peu plus d'informations ci-dessus.

2

Vous ne finirez avec cinq éléments que si tableView:numberOfRowsinSection: renvoie 5. C'est la réponse simple à votre question, mais je vois d'autres problèmes ici. Je me demande pourquoi vous avez ce test: row < recentItems.count. Ce tableau est-il la même chose que [ItemsController sharedItemsController].count? Vous devez vraiment utiliser le même tableau pour les deux méthodes.

(De plus, ce n'est pas une erreur de syntaxe, mais vous ne devriez pas utiliser la syntaxe de la propriété pour des choses qui ne sont pas déclarées comme des propriétés. Vous devez écrire [recentItems count] à la place.)

Je suis aussi confus par la code que vous utilisez pour configurer la cellule. Les cellules sont censées être réutilisables. C'est-à-dire que vous créez une cellule, puis la reconfigurez à chaque fois dans votre implémentation de tableView:cellForRowAtIndexPath:. Votre code crée une cellule pour chaque élément de votre liste. Ceci est très inefficace en mémoire, et va probablement planter votre programme en raison d'une mémoire insuffisante sur l'iPhone si vous gardez beaucoup de cellules dans la mémoire comme ça.

L'approche recommandée est d'appeler dequeueReusableCellWithIdentifier:. Si cela renvoie nil, vous configurez une cellule à l'aide de l'initialiseur initWithFrame:reuseIdentifier:. La vue de la table est très intelligente et vous demandera seulement de redessiner la cellule quand vous en aurez besoin.

Votre dictionnaire recentCellData me semble également très fragile. Que faire si vous insérez un élément après l'élément avec la clé @"2"? Tous les éléments avec la clé @"3" devront être déplacés d'un élément vers la droite pour fonctionner comme prévu. C'est une tonne de comptabilité qui me semble plutôt inutile. Si vous aviez vraiment besoin de quelque chose comme ceci - et pour être clair, je ne pense pas que vous le feriez - pourquoi ne pas utiliser un NSMutableArray, ce qui est beaucoup plus facile à utiliser?

+0

J'utilise un NSMutableArray. Tout tourne autour de la façon dont la vue est affichée. Si je quitte l'application et redémarre, tout est affiché comme il se doit. – Jeff

+0

Je faisais référence à recentCellData. C'est un dictionnaire. – Alex

+0

Je vois ce que tu veux dire. Laissez-moi voir si je peux m'attaquer à ça ... – Jeff