L'animation de Suppression de Ligne dans UITableView avec CoreData donne échec d'Assertion
J'ai un UITableView qui affiche une liste des objets stockés avec CoreData. Je peux supprimer un objet en utilisant le code suivant:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"Delete row");
[managedObjectContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
//Save the context.
NSError *error;
if (![managedObjectContext save:&error]) {
/*do this gracefully one day */
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self refreshTables]; //where refreshTables just reloads the data the table is using and calls [self.tableView reloadData];
}
}
Mais il n'a pas d'animation ou de l'esthétique.
Lorsque j'essaie d'animer en remplaçant
[self refreshTables];
avec
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
J'obtiens l'erreur suivante:
Échec d'Assertion dans -[UITableView _endCellAnimationsWithContext:], >/SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:920
2010-10-30 16:46:35.717 MyApp[38226:207] * Résiliation d'application en raison de uncaught exception 'NSInternalInconsistencyException', la raison: 'mise à jour incorrecte: non valides nombre de lignes dans la section 0. Le nombre de lignes contenues dans une section existante après la mise à jour (3) doit être égal au nombre de lignes contenues dans cette section avant la mise à jour (3), plus ou moins le nombre de lignes insérées ou supprimées à partir de cette section (0 inséré, 1 supprimés).'
J'ai essayé d'avoir le deleteRowsAtIndexPaths code dans une variété d'endroits dans le commitEditingStyle code à pas de chance (par exemple avant de retirer l'objet à partir de la mOC) mais je n'arrive pas à obtenir autour de cette erreur.
Je sais d'Apple iPhoneCoreDataRecipes exemple traite le problème par la mise en place d'un délégué pour l'FetchedResultsController pour gérer l'édition /suppression de lignes, mais à ce stade du développement, si possible, je veux juste une solution simple pour animer ces objets supprimés.
Comment puis-je animer la suppression d'une ligne, avant/après, j'ai supprimer l'objet de mon managedObjectContext?
EDIT: j'ai essayé d'avoir deleteRowsAtIndexPaths avant et après le retrait de l'élément de la mOC, avec la même erreur.
OriginalL'auteur glenstorey | 2010-10-30
Vous devez vous connecter pour publier un commentaire.
Lorsque nous utilisons NSFetchedResultsController tant que source de données de UITableView, nous ne pouvons pas invoquer
deleteRowsAtIndexPaths: withRowAnimation:
en fonctiontableView: commitEditingStyle: forRowAtIndexPath:
, qui va jeter l'exception que la question mentionnée.Une façon de résoudre ce problème est en invoquant
[self.tableView reloadData]
danscontrollerDidChangeContent:
de protocoleNSFetchedResultsControllerDelegate
. Il résout, cependant, il n'y a pas de Supprimer l'Animation de Fondu plus.Donc, l'alternative pratique, c'est en invoquant
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]
danscontroller: didChangeObject: atIndexPath: forChangeType:
.newIndexPath:
Exemple de code ci-dessous:
OriginalL'auteur Robin
1) j'ai mis en place un bon délégué.
2) j'ai enlevé un appel en viewWillLoad à [soi.tableview reloadData]; ce qui est (bizarrement) messing tout (ce post m'a donné une idée de ce qu'il faut rechercher et de supprimer Grave Erreur d'Application dans la Base de Données avec fetchedResultsContainer ).
OriginalL'auteur glenstorey
Êtes-vous à l'aide d'un NSFetchedResultsController?
Vous obtenez cette erreur, parce que l'objet est toujours dans votre tableview source de données.
Peut-être
at this stage in development
vous utilisez lesimple solution
et remplir NSArrays avec des objets à partir d'un NSFetchRequest. Ensuite, il sera inutile de retirer l'objet à partir de l'objet géré contexteêtes-vous d'utiliser un cache pour la NSFetchedResultsController? J'ai juste eu un autre coup d'oeil dans la documentation et trouvé ceci:
Donc le mode du contrôleur est "Sans suivi". Ce qui signifie que les objets ne sont pas supprimés à partir du contrôleur si ils sont supprimés à partir de l'objet géré.
Ce qui signifie
just reloads the data
dans le code derefreshTables
? Essayez de faire de même avant de retirer les lignes.Ou ajouter ces 20 lignes nécessaires pour obtenir le délégué de travail.
Je suppose que je n'ai pas lu votre question de manière approfondie la première fois, voir mon edit.
OriginalL'auteur Matthias Bauch
OriginalL'auteur Manjunath