Animieren Zeile Löschen in UITableView mit CoreData gibt Assertion-Fehler
Ich habe eine UITableView, die zeigt eine Liste von Objekten gespeichert, die mit CoreData. Kann ich ein Objekt löschen, verwenden Sie den folgenden code:
- (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];
}
}
Aber es hat keine animation oder ästhetik.
Wenn ich versuche zu animieren, durch den Austausch
[self refreshTables];
mit
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
Bekomme ich die folgende Fehlermeldung:
Assertionsfehler in -[UITableView _endCellAnimationsWithContext:], >/SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:920
2010-10-30 16:46:35.717 MyApp[38226:207] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Ungültiges update: ungültige Anzahl von Zeilen im Abschnitt 0. Die Anzahl der Zeilen, die in einer bestehenden Abschnitt nach dem update (3) muss gleich sein der Anzahl der Zeilen in diesem Abschnitt, bevor Sie das update (3) plus oder minus die Anzahl der Zeilen, die eingefügt oder gelöscht, der Abschnitt (0 eingefügt, 1 gestrichen).'
Habe ich versucht, mit der deleteRowsAtIndexPaths - code in einer Vielzahl von Orten in der commitEditingStyle code nicht mit Glück (zum Beispiel vor dem entfernen des Objekts aus dem mOC), aber ich kann nicht scheinen, um diesen Fehler.
Ich weiß, Apple ist iPhoneCoreDataRecipes Beispiel behandelt das problem durch die Einrichtung einer Stellvertretung für die FetchedResultsController zu editieren /löschen von Zeilen, aber in diesem Stadium in der Entwicklung, wenn möglich, ich möchte nur eine einfache Lösung für das animieren, diese gelöschten Objekte.
Wie kann ich Sie animieren die Entfernung von einer Zeile, bevor/nachdem ich entfernen Sie das Objekt aus meinem managedObjectContext?
EDIT: ich habe versucht, mit deleteRowsAtIndexPaths vor und nach dem entfernen des Elements aus dem mOC, mit dem gleichen Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn wir NSFetchedResultsController als Datenquelle für UITableView, können wir nicht aufrufen
deleteRowsAtIndexPaths: withRowAnimation:
in FunktiontableView: commitEditingStyle: forRowAtIndexPath:
, die Ausnahme auslösen als Frage erwähnt.Einen Weg, um dieses Problem zu lösen ist, indem
[self.tableView reloadData]
imcontrollerDidChangeContent:
aus dem ProtokollNSFetchedResultsControllerDelegate
. Es löst tatsächlich, es ist jedoch nicht zu Löschen, Fade-Animation mehr.So, die alternative bequemer Weg durch die Anrufung
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]
imcontroller: didChangeObject: atIndexPath: forChangeType:
.newIndexPath:
Beispiel-code wie folgt:
1) ich habe eine richtige delegieren.
2) entfernte ich einen Anruf in viewWillLoad zu [self.tableview reloadData]; war (komischerweise) messing alles (dieser Beitrag gab mir eine Ahnung für das, was Sie suchen und entfernen: Schweren Fehler in der Core Data mit fetchedResultsContainer ).
Verwenden Sie ein NSFetchedResultsController überhaupt?
Sie erhalten diese Fehlermeldung, da das Objekt sich noch in Ihrem tableview datasource.
Vielleicht
at this stage in development
Sie diesimple solution
und füllen NSArrays mit Objekten aus einem NSFetchRequest. Dann wird es sinnlos, zu entfernen, wird das Objekt aus der managed-object-context -sind Sie mit einem cache für den NSFetchedResultsController? Ich musste einfach noch einen Blick in die Dokumentation und die gefunden:
Also der Modus der controller ist "Kein tracking". Was bedeutet, dass Objekte nicht von der Steuerung entfernt werden, wenn Sie entfernt werden aus dem verwalteten Objekt.
Was bedeutet
just reloads the data
im code vonrefreshTables
? Versuchen Sie, das gleiche zu tun, bevor Sie entfernen von Zeilen.Oder fügen Sie diese 20 Zeilen brauchte, um das delegieren von arbeiten.