Note that there are some explanatory texts on larger screens.

plurals
  1. PONSUndoManager undo Not Working With Core Data
    text
    copied!<p>I am trying to create an iPhone application where the user can add entries. When he presses a new entry, a box will popup asking him for some information. Then he can either press "Cancel" or "Save" to discard the data or save it to disk.</p> <p>For saving, I am using the Core Data framework, which works pretty well. However, I cannot get the "Cancel" button to work. When the window pops up, asking for information, I create a new object in the managed object context (MOC). Then when the user presses cancel, I try to use the NSUndoManager belonging to the MOC.</p> <p>I would also like to do it using nested undo groups, because there might be nested groups. </p> <p>To test this, I wrote a simple application. The application is just the "Window based application" template with Core Data enabled. For the Core Data model, I create a single entity called "Entity" with integer attribute "x". Then inside the applicationDidFinishLaunching, I add this code:</p> <pre><code>- (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]; } </code></pre> <p>The idea is simple. Try to insert a new Entity object, undo it, fetch all Entity objects in the MOC and print them out. If everything worked correctly, there should be no objects at the end.</p> <p>However, I get this output:</p> <pre><code>[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 </code></pre> <p>As you can see, the object is present in the MOC after I try to undo its creation. Any suggestions as to what I am doing wrong?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload