2010-06-03 5 views
3

내 앱에서 실행 취소/다시 실행 메커니즘을 구현하고 있습니다. 이것은 많은 경우에 잘 작동합니다. 그러나 과거의 deleteObject :를 취소 할 수는 없습니다. 객체는 실행 취소 대기열에 올바르게 저장됩니다. 다시 실행하여 실행 취소를 호출하면 코어 데이터 스택에 다시 등록됩니다. 문제는 삭제할 때 속성이 모두 nil로 설정된다는 것입니다.코어 데이터 deleteObject : 속성을 nil로 설정합니다.

필자는 "그래픽"엔티티에 "그래픽"이라는 수 많은 관계가있는 "캔버스"엔티티가 있는데,이 엔티티의 역함수는 "캔버스"로 설정되어 있습니다. 그래픽을 삭제 한 다음 다시 삽입하면 작동하지 않습니다.

- (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에 의해 완전히 표백 된 동일한 객체임을 알 수 있습니다. 관계를 삭제하는 roul은 분명히 테스트와 관련하여 "No Action"으로 설정 했으므로 아무 관계가 없습니다.

답변

2

글쎄, 나는 그 수정에 만족하지 못하지만 한 가지 방법은 객체를 삭제하기 전에 컨텍스트에서 [moc save]를 수행하는 것이다. 안타깝게도 실행 취소/다시 실행 상황에서 이것은 모든 작업 이후에 저장해야한다는 것을 의미합니다. 이는 차선책이지만이 문제를 해결합니다.

+0

위대한 답변! 나는 반대 상황을 디버깅하려고 할 때 무수한 시간을 보냈다. 내가 삽입 한 객체를 원상태로 되돌리고 싶었고, 다시 비어있게되었다. 개체를 삽입하기 전에 컨텍스트를 저장하면 문제가 저장됩니다. 이상하지만 작동합니다. –

관련 문제