Ich habe eine UITableView, die eine Liste von Objekten zeigt, die mit CoreData gespeichert sind. Ich kann ein Objekt mit dem folgenden Code löschen:
%Vor%Aber es hat keine Animation oder Ästhetik.
Wenn ich versuche zu animieren, indem ich
ersetze %Vor%mit
%Vor%Ich erhalte den folgenden Fehler:
Assertionsfehler in - [UITableView _endCellAnimationsWithContext:], & gt; /SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m: 920 2010-10-30 16: 46: 35.717 MyApp [38226: 207] * Beenden von App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'Ungültiges Update: ungültige Anzahl von Zeilen in Abschnitt 0. Die Nummer der Zeilen, die in einem vorhandenen Abschnitt nach dem Update (3) enthalten sind, muss gleich der Anzahl der Zeilen in diesem Abschnitt vor dem Update sein (3), plus oder minus der Anzahl der Zeilen aus diesem Abschnitt eingefügt oder gelöscht (0 eingefügt, 1 gelöscht). "
Ich habe versucht, den Code deleteRowsAtIndexPaths an einer Vielzahl von Stellen im commitEditingStyle-Code ohne Glück zu haben (zum Beispiel vor dem Entfernen des Objekts aus dem mOC), aber ich komme nicht herum dieser Fehler.
Ich weiß, dass das iPhoneCoreDataRecipes-Beispiel von Apple das Problem löst, indem es einen Delegaten für den FetchedResultsController zum Bearbeiten / Löschen von Zeilen einrichtet, aber in diesem Stadium der Entwicklung, wenn möglich, möchte ich nur eine einfache Lösung für die Animation dieser gelöschten Objekte.
Wie kann ich das Entfernen einer Zeile animieren, bevor / nachdem ich das Objekt aus meinem managedObjectContext entfernt habe?
BEARBEITEN: Ich habe versucht, deleteRowsAtIndexPaths vor und nach dem Entfernen des Elements aus dem MOC mit dem gleichen Fehler zu haben.
1) Ich habe einen korrekten Delegierten eingerichtet.
2) Ich habe einen Aufruf in viewWillLoad zu [self.tableview reloadData]; was (seltsamerweise) alles vermasselte (dieser Post gab mir einen Hinweis darauf, wonach ich suchen und entfernen sollte: Schwerwiegender Anwendungsfehler in Core-Daten mit holedResultsContainer ).
Wenn wir NSFetchedResultsController als DataSource von UITableView verwenden, können wir deleteRowsAtIndexPaths: withRowAnimation:
in der Funktion tableView: commitEditingStyle: forRowAtIndexPath:
nicht aufrufen, wodurch die Ausnahme als Frage ausgegeben wird.
Eine Möglichkeit, dieses Problem zu lösen, besteht darin, [self.tableView reloadData]
in controllerDidChangeContent:
vom Protokoll NSFetchedResultsControllerDelegate
aufzurufen. Es löst jedoch tatsächlich, es gibt keine Delete Fade Animation mehr.
Der alternative bequeme Weg besteht also darin, [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]
in controller: didChangeObject: atIndexPath: forChangeType:
newIndexPath:
aufzurufen.
Beispielcode wie folgt:
%Vor% Verwenden Sie überhaupt einen NSFetchedResultsController?
Sie erhalten diesen Fehler, weil das Objekt immer noch in Ihrer Tabellenansicht Datenquelle ist.
Vielleicht at this stage in development
Sie verwenden simple solution
und füllen NSArrays mit Objekten aus einem NSFetchRequest. Dann wird es sinnlos sein, das Objekt aus dem Kontext des verwalteten Objekts zu entfernen
Verwenden Sie einen Cache für den NSFetchedResultsController? Ich habe gerade einen anderen Blick in die Dokumentation geworfen und folgendes gefunden:
Ein Controller hat somit effektiv drei Betriebsmodi, bestimmt ob es einen Delegierten hat und ob der Name der Cache-Datei festgelegt ist.
Keine Verfolgung: Der Delegat ist auf eingestellt Null. Der Controller bietet einfach Zugriff auf die Daten wie bei der Fetch wurde ausgeführt.
Nur-Speicher-Tracking: Der Delegat ist non-nil und der Name des Dateicaches ist festgelegt zu Null. Der Controller überwacht Objekte in seiner Ergebnismenge und Updates Abschnitt und Bestellinformationen in Antwort auf relevante Änderungen.
Vollständige persistente Verfolgung: der Delegat und der Name des Datei-Caches ist nicht-null. Der Controller überwacht Objekte in seinem Ergebnismenge und Updates Abschnitt und Bestellinformationen als Antwort auf relevante Änderungen. Der Controller pflegt einen persistenten Cache des Ergebnisse seiner Berechnung.
Der Modus des Controllers lautet also "No tracking". Dies bedeutet, dass Objekte nicht aus dem Controller entfernt werden, wenn sie aus dem verwalteten Objekt entfernt werden.
Was bedeutet just reloads the data
im Code von refreshTables
? Versuchen Sie dasselbe zu tun, bevor Sie Zeilen entfernen.
Oder fügen Sie diese 20 Zeilen hinzu, die benötigt werden, um den Delegierten zum Laufen zu bringen.
Tags und Links iphone uitableview core-data cocoa-touch