Das Animieren der Zeilenlöschung in UITableView mit CoreData führt zu einem Assertionsfehler

8

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.

    
glenstorey 30.10.2010, 04:05
quelle

4 Antworten

7

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 ).

    
glenstorey 07.11.2010, 04:42
quelle
17

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%     
Robin 14.11.2010 10:52
quelle
0

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.

    
Matthias Bauch 30.10.2010 10:30
quelle
-2
%Vor%     
Manjunath 30.10.2010 06:16
quelle