Ich versuche, eine iPhone-Anwendung zu erstellen, wo der Benutzer Einträge hinzufügen kann. Wenn er einen neuen Eintrag drückt, erscheint eine Box, die ihn nach Informationen fragt. Dann kann er entweder "Abbrechen" oder "Speichern" drücken, um die Daten zu verwerfen oder auf der Festplatte zu speichern.NSUndoManager rückgängig machen funktioniert nicht mit Core-Daten
Zum Speichern verwende ich das Core Data Framework, das ziemlich gut funktioniert. Ich kann jedoch die Schaltfläche "Abbrechen" nicht ausführen. Wenn das Fenster erscheint und nach Informationen fragt, erstelle ich ein neues Objekt im Kontext des verwalteten Objekts (MOC). Wenn der Benutzer dann Abbrechen drückt, versuche ich den zum MOC gehörenden NSUndoManager zu verwenden.
Ich würde es auch gerne mit geschachtelten Gruppen rückgängig machen, weil es verschachtelte Gruppen geben könnte.
Um dies zu testen, schrieb ich eine einfache Anwendung. Die Anwendung ist nur die Vorlage "Fensterbasierte Anwendung" mit aktivierten Kerndaten. Für das Core-Data-Modell erstelle ich eine einzelne Entität namens "Entity" mit dem Ganzzahlattribut "x". Dann füge ich innerhalb der applicationDidFinishLaunch diesen Code hinzu:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
unsigned int x=arc4random()%1000;
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager beginUndoGrouping];
NSManagedObject *entity=[NSEntityDescription insertNewObjectForEntityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[entity setValue:[NSNumber numberWithInt:x] forKey:@"x"];
NSLog(@"Insert Value %d",x);
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager endUndoGrouping];
[self.managedObjectContext.undoManager undoNestedGroup];
NSFetchRequest *fetchRequest=[[NSFetchRequest alloc] init];
NSEntityDescription *entityEntity=[NSEntityDescription entityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entityEntity];
NSArray *result=[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
for(entity in result) {
NSLog(@"FETCHED ENTITY %d",[[entity valueForKey:@"x"] intValue]);
}
[window makeKeyAndVisible];
}
Die Idee ist einfach. Versuchen Sie, ein neues Entity-Objekt einzufügen, rückgängig zu machen, alle Entity-Objekte im MOC abzurufen und auszudrucken. Wenn alles richtig funktioniert hat, sollte es am Ende keine Objekte geben.
Allerdings bekomme ich diese Ausgabe:
[Session started at 2010-02-20 13:41:49 -0800.]
2010-02-20 13:41:51.695 Untitledundotes[7373:20b] Insert Value 136
2010-02-20 13:41:51.715 Untitledundotes[7373:20b] FETCHED ENTITY 136
Wie Sie sehen können, das Objekt in der MOC vorhanden ist, nachdem ich versuche, seine Schöpfung rückgängig zu machen. Irgendwelche Vorschläge, was ich falsch mache?
Hallo Ich habe das gleiche Problem. Hast du eine Lösung gefunden? Haben Sie versucht, "undo" anstelle von "undoNestedGroup" zu verwenden? Dank gonso – gonso