我想創建一個iPhone應用程序,用戶可以在其中添加條目。當他按下新條目時,會彈出一個框詢問他一些信息。然後,他可以按「取消」或「保存」丟棄數據或將其保存到磁盤。NSUndoManager撤消不處理核心數據
爲了節省,我使用了Core Data框架,它工作得很好。但是,我無法使「取消」按鈕正常工作。當窗口彈出時,詢問信息,我在託管對象上下文(MOC)中創建一個新對象。然後當用戶按下取消時,我嘗試使用屬於MOC的NSUndoManager。
我也想用嵌套撤消組來做,因爲可能有嵌套組。
爲了測試這個,我寫了一個簡單的應用程序。該應用程序只是啓用了核心數據的「基於窗口的應用程序」模板。對於核心數據模型,我使用整數屬性「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後,我試圖解開它的創作。 關於我在做什麼錯的任何建議?
嗨 我有一個非常相同的問題。你找到解決方案嗎? 您是否嘗試過使用「撤消」而不是「undoNestedGroup」? 謝謝 gonso – gonso 2010-03-09 12:08:36