Gewusst wie: aktualisieren einer UITableViewController oder NSFetchedResultsController?
Ich habe ein kleines problem mit meinem UITableViewController oder NSFetchedResultsController. Ich bin nicht sicher, was das problem ist ein Source-aber ich denke, es ist die UITableViewController.
Als ich sagte, ich einen NSFetchedResultsController zu füllen meine Daten in einem UITableViewController. Die Daten werden nach Datum sortiert und wird auch angezeigt in den Abschnitten von Datum-Jahr z.B. Mai 2010/Juni 2010/und so weiter. Dies erscheint als Abschnittsüberschrift.
Wenn ich jetzt neue Daten hinzufügen, es wird automatisch das aktuelle Datum verwendet als default, aber wenn ich verwenden möchten, ein Datum, dass ist derzeit nicht in der Liste Abschnitt, z.B. April 2010 (aktuell Mai und Juni in der Liste), dann ist dies nicht korrekt angezeigt. Nur wenn ich die app beenden und neu starten, es zeigt den neuen Abschnitt Header und alles ist gut.
So, die ich irgendwie brauchen, um in der Lage sein zu aktualisieren meiner Liste oder zu aktualisieren. Indem Sie nur an den Kontext und ändern scheint es nicht zu aktualisieren.
Wieder, ich bin nicht sicher, was ich brauchen, um zu aktualisieren, wenn es ist mein NSFetchedResultsController Objekt oder die UITableViewController.
UPDATE #1:
Ich dachte nur, dass es eine Ausnahme bei dieser Methode :
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
//The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
Dies ist, wo ich die Daten verschieben :
- (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:
// [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
//Reloading the section inserts a new row and ensures that titles are updated appropriately.
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Diese Methode ist ziemlich viel genommen von der CoreDataBooks Beispiel von Apple. Und das ist der Fehler :
Schwere Anwendungsfehler. Ein
Ausnahme war gefangen von den Delegierten
der NSFetchedResultsController während einer
Aufruf -controllerDidChangeContent:.
*** -[NSMutableArray removeObjectAtIndex:]: index 1 über
Grenzen [0 .. 0] mit userInfo (null)
Und nach, dass der Bearbeiten-Modus (wo der löschen button erscheint) funktioniert nicht mehr.
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, sieht aus wie ich eine Lösung gefunden, ich habe gerade überspringen Sie diese
und immer tun.
Ich werde natürlich dies geben etwas mehr Logik, denn das problem existiert nur, wenn ich will, um meine Daten in einem Abschnitt, der nicht vorhanden ist, bevor. Bis jemand kann mir eine echte Lösung, werde ich gehen mit diesem ein.
reloadData
so. Wenn Sie auf >= 4.0, Mach es wie die Dokumentation sagt.Annahme der fix von Apple in iPhoneCoreDataRecipes in der version 1.2, die richtige Sache zu tun ist, zu ersetzen
mit
(FileMerge ist dein Freund!)
Beachten Sie, es gibt ein weiteres Update in der version 1.2, die verhindert, dass unregelmäßig abstürzt, wenn neue Einträge anlegen. Ich hatte das gemeldet und es wurde behoben, innerhalb von zwei Wochen. Ich ermutige Sie, um die Datei bug-reports bei Apple. Sie sind viel stärker als Sie denken, und Sie können erwarten, um die beste mögliche Lösung.
Sie implementieren müssen, um die
controller:didChangeSection:atIndex:forChangeType:
delegate-Methoden. In haben, senden SieinsertSections:withRowAnimation:
,deleteSections:withRowAnimation:
, undreloadSections:withRowAnimation:
Nachrichten zu Ihrer Tabelle anzeigen, abhängig von den berichteten Typ ändern.controller:didChangeSection:atIndex:forChangeType:
.