我正在尝试创建一个iPhone应用程序,用户可以添加条目。当用户按下新条目时,将弹出一个框要求输入相关信息。然后,他可以选择“取消”或“保存”以丢弃数据或将其保存到磁盘中。
为了保存数据,我使用Core Data框架,它的效果非常好。但是,我无法让“取消”按钮起作用。当窗口弹出要求输入信息时,我在托管对象上下文(MOC)中创建一个新对象。然后当用户按下取消时,我尝试使用属于MOC的NSUndoManager。
我还想使用嵌套撤消组来实现,因为可能存在嵌套组。
为了测试这一点,我编写了一个简单的应用程序。该应用程序只是启用了Core Data的“基于窗口的应用程序”模板。对于Core Data模型,我创建了一个名为“Entity”的单个实体,带有整数属性“x”。然后在applicationDidFinishLaunching中,我添加了以下代码:
为了保存数据,我使用Core Data框架,它的效果非常好。但是,我无法让“取消”按钮起作用。当窗口弹出要求输入信息时,我在托管对象上下文(MOC)中创建一个新对象。然后当用户按下取消时,我尝试使用属于MOC的NSUndoManager。
我还想使用嵌套撤消组来实现,因为可能存在嵌套组。
为了测试这一点,我编写了一个简单的应用程序。该应用程序只是启用了Core Data的“基于窗口的应用程序”模板。对于Core Data模型,我创建了一个名为“Entity”的单个实体,带有整数属性“x”。然后在applicationDidFinishLaunching中,我添加了以下代码:
- (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];
}
这个想法很简单。尝试插入一个新的实体对象,然后撤销它,在MOC中获取所有实体对象并打印出来。如果一切正常,最终不应该有任何对象。
然而,我得到了这个输出:
[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
从您可以看到的情况来看,在尝试撤销对象的创建后,该对象存在于MOC中。 有什么建议我做错了吗?