2009-06-19 6 views
21

J'utilise l'idée GenericTableViewController de Matt Gallagher pour contrôler mon UITableViews. Ma source de données est un NSFetchedResultsController.Comment faire deleteRowsAtIndexPaths: fonctionne avec GenericTableViewController?

http://cocoawithlove.com/2008/12/heterogeneous-cells-in.html

Tout fonctionne très bien, jusqu'à ce que je tente de supprimer une cellule.

Je le code suivant dans mon View Controller:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     // Delete the managed object. 
     NSManagedObjectContext *context = [wineryController managedObjectContext]; 
     [context deleteObject:[wineryController objectAtIndexPath:indexPath]]; 

     NSError *error; 
     if (![context save:&error]) { 
      // Handle the error. 
     } 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 

La dernière ligne se bloque avec l'explication plutôt bavard dans la console:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Invalid update: invalid number of rows in section 0. The number of rows 
contained in an existing section after the update (5) must be equal to the number 
of rows contained in that section before the update (5), plus or minus the number 
of rows inserted or deleted from that section (0 inserted, 1 deleted).'

OK, je comprends ce qu'il dit. .. une ligne n'est pas supprimée (je suppose) parce que je ne redirige pas un message au bon endroit (puisque j'ai déplacé du code de son emplacement "normal") ... quelqu'un a une idée de laquelle? Je suis totalement perplexe sur celui-ci.

Répondre

67

Eh bien, bah. Je viens de trouver this réponse, ce qui n'est pas la même chose, mais je me suis dirigé dans la bonne direction. Je vais laisser cela ici pour quiconque dans le futur ayant des problèmes similaires.

La clé est d'envelopper les deleteRowsAtIndexPaths avec balises début et de fin, et forcer le modèle à mettre à jour dans le même bloc, ce qui:

[tableView beginUpdates]; 
[self constructTableGroups]; 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
     withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

Cela a causé le problème en aller, et les animations à fonctionne parfaitement.

+4

+1 Merci beaucoup pour la réponse. –

+2

Vous êtes autorisé à modifier la source de données avant le bloc d'animation. L'erreur que vous avez constatée indique que vous n'avez pas modifié la source de données avant d'animer la suppression. Assurez-vous que la source de données est dans l'état final (après les suppressions) avant d'animer la suppression de ces lignes. – Mark

+0

J'oublie toujours ceci ... pourquoi le code du template XCode n'inclut-il pas ces lignes? – Echelon

Questions connexes