2010-06-03 39 views
3

我在我的應用程序中實現了撤銷/重做機制。這適用於很多情況。但是,我無法撤消過去的deleteObject :.該對象被正確保存在撤銷隊列中,並且在調用撤消時我可以很好地將其恢復到核心數據堆棧中。問題是,當我刪除它時,它的所有屬性都設置爲零。核心數據deleteObject:將屬性設置爲零

我有一個實體「畫布」與一個「圖形」一對多關係的「圖形」實體,它的反設爲「畫布」。刪除圖形,然後插回,不起作用。下面的代碼(重做方法基本相同):

- (void)deleteGraphic:(id)aGraphic { 
//NSLog(@"undo drawing"); 
//Prepare the undo/redo 
[self.undoManager beginUndoGrouping]; 
[self.undoManager setActionName:@"Delete Graphic"]; 

[[self.detailItem valueForKey:@"graphics"] removeObject:aGraphic]; 
[[self managedObjectContext] deleteObject:aGraphic]; 

//End undo/redo 
[self.undoManager registerUndoWithTarget:self selector:@selector(insertGraphic:) object:aGraphic]; 
[self.undoManager endUndoGrouping]; 

NSLog(@"graphics are %@", [self sortedGraphics]); 

//Update drawing 
[self.quartzView setNeedsDisplay]; 
} 

和這裏的wierdness:

之前將其刪除:

重做
graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: { 
canvas = 0x162b70 <x-coredata://A919979E-75AD-474D-9561-E0E8F3388718/Canvas/p20>; 
content = <62706c69 73743030 d4010203 04050609 0a582476 65727369 6f6e5424 746f7059 24617263 68697665 7258246f 626a6563 7473>; 
frameRect = nil; 
label = nil; 
order = 1; 
path = "(...not nil..)"; 
traits = "(...not nil..)"; 
type = Path; 
}) 

後:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: { 
canvas = nil; 
content = nil; 
frameRect = nil; 
label = nil; 
order = 0; 
path = nil; 
traits = nil; 
type = nil; 
}), 

你可以看到它是同一個對象,只是被Core Data完全褪色了。刪除輪詢的關係顯然與它無關,因爲我在測試中將它們設置爲「無操作」。

回答

2

嗯,我對修復不滿意,但一種方法是在刪除對象之前在上下文中執行[moc保存]。不幸的是,在撤銷/重做情況下,這意味着我必須在每次操作後進行保存,這是次優的,但可以解決此問題。

+0

很好的答案!我花了無數小時試圖調試相反的情況:我想撤消一個我插入的對象,並且它回來了。在插入對象之前保存上下文保存了問題。奇怪,但有效。 – 2012-07-27 02:28:43