Ich habe eine einfache Tabellenansicht mit 1 Abschnitt und 2 Zeilen. Ich verwende eine NSFetchedResultsController
, um die Tabelle mit CoreData synchronisiert zu halten. Ich ändere eine der Zeilen auf der CD, die eine Tabellenansichtszelle zum Aktualisieren und Verschieben auslöst. Das Problem ist, dass wenn cellForRowAtIndexPath:
während der NSFetchedResultsChangeUpdate
aufgerufen wird, die falsche Zelle zurückgegeben wird (das macht Sinn b/c die Zellen wurden noch nicht verschoben). Daher wird die falsche Zelle mit den neu aktualisierten Daten aktualisiert. Danach wird die NSFetchedResultsChangeMove
Nachricht behandelt, so dass die Zellen ihre Plätze tauschen (der Inhalt beider Zellen wird nicht aktualisiert, da es sich nur um einen Anruf handelt). Das Ergebnis ist, dass beide Zellen die Daten von der neu aktualisierten CD-Entität wiedergeben. Das erneute Laden der Tabelle behebt das Problem. Ich betreibe iOS 6. Mit anderen Worten, wenn die Zelle bei Index 0 Entität A darstellt und Index 1 Entität B darstellt und I Entität A zu A 'aktualisieren, so dass die 2 Zellen umgekehrte Reihenfolge, das Ergebnis ist, dass I siehe 0: A '1: A wenn ich 0: B, 1: A' erwarten würde.Gleichzeitige Verschiebung und Aktualisierung von UITableViewCell und NSFetchedResultsController
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
//the wrong cell is updated here
[self configureCell:(SyncCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath];
//this code produces errors too
//[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
//[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Unabhängig davon erhalte ich keine Update-Ereignisse, wenn ich moveRowAtIndexPath anstelle von delete + insert combo verwende. Irgendeine Idee, was kann die Ursache sein? – Andy