2009-06-15 8 views
1

J'effectue une suppression de plusieurs lignes d'une table. En fait, à cette occasion, toutes les cellules visibles sont en fait effacées. Cela provoque la visibilité de la cellule immédiatement au-dessous du cadre visible après l'animation, puisque toutes les cellules situées au-dessus sont maintenant supprimées.Comment gérer les lignes non visibles lors de la suppression d'une ligne. (UITableViews)

Voici le problème, cette cellule est également supprimée. J'obtiens donc l'erreur suivante, je suppose, parce que la vue de table veut que je supprime une cellule qui n'est pas sur l'écran. (mais sera à l'écran pendant/après l'animation).

2009-06-15 17:44:30.114 HSS[18175:20b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 4. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).' 
2009-06-15 17:44:30.117 HSS[18175:20b] Stack: (
    807902715, 
    2429263419, 
    807986683, 
    811271572, 
    815059595, 
    815007323, 
    97367, 
    96328, 
    96282, 
    810768858, 
    807687328, 
    807683624, 
    839142449, 
    839142646, 
    814752238, 
    10968, 
    10822 
) 

Alors qu'est-ce que je fais dans cette situation?

Le code qui provoque l'exception est le suivant. Notez que je crée en fait un nouveau tableau appelé "filteredTableGroups" dans une autre méthode. C'est le modèle mis à jour. "allTableGroups" est chaque contrôleur de cellule. Chaque contrôleur de cellule contient un dictionnaire utilisé pour remplir ses données de cellules. J'utilise une clé, "filteredDataSet", pour déterminer si une cellule doit rester dans la table filtrée. Pendant la suppression de la cellule tableview, j'échange tableGroups pour pointer vers le modèle mis à jour. (Je crée mon code similaire à Matt Gallagher et Craig Hockenberry de la solution de l'utilisation cellulaire du Contrôleur pour contrôler les cellules individuelles)

- (void)collapseVisableCells{ 

NSMutableArray *cellsToRemove = [NSMutableArray array]; 

for(NSArray *sections in self.allTableGroups){ 

    for(ScheduleCellController *cellController in sections){ 

     NSString *shouldDisplayString = (NSString*)[[cellController model] objectForKey:@"filteredDataSet"]; 

     BOOL shouldDisplay = [shouldDisplayString boolValue]; 

     if(!shouldDisplay){ 

      UITableViewCell *theCell = [cellController myCell]; 

      NSIndexPath *cellPath = [self.tableView indexPathForCell:theCell]; 
      NSLog([cellPath description]); 

      if(cellPath!=nil) 
       [cellsToRemove addObject:cellPath]; 


     } 
    } 

} 



[self.tableView beginUpdates]; 
tableGroups = self.filteredTableGroups; 
[self.tableView deleteRowsAtIndexPaths:cellsToRemove withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableView endUpdates]; 

}

Répondre

3

Je ne suis pas sûr que je comprends bien ce que vous voulez dire, mais vous pouvez essayez ce qui suit.

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Chaque fois que vous supprimez un objet de votre tableau de modèle lié à une section spécifique du tableView, vérifier si le nombre de tableau est égal à zéro, auquel cas ajouter un index représentant la section des indices:

[array removeObjectAtIndex:indexPath.row]; 
if(![array count]) 
    [indexes addIndex: indexPath.section]; 

Determine all of the indexPaths related to the rows to be deleted, then update the tableView as follows: 

[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

Faites-moi savoir si cela fonctionne pour vous.

+1

Je vais essayer de supprimer les "sections mortes" et voir si cela résout mon problème. C'est difficile d'expliquer le problème. Le problème principal est que je ne peux pas supprimer les cellules qui sont hors de l'écran, mais la tableview se plaint que je n'ai pas supprimé une cellule qui est hors écran. Retrait de toute la section peut travailler pour remédier à cette situation. Mais je n'appellerais pas ce comportement attendu. –

+0

Cela a fonctionné. En supprimant les sections vides, j'ai pu contourner le problème. Pas que je devrais afficher des sections vides. Il était plutôt fastidieux de garder une trace des sections à supprimer, mais cela a très bien fonctionné. Merci. –

Questions connexes