2010-03-10 8 views
1

NSManagedObjectContext와 연결된 기본 제공 NSUndoManager를 통해 실행 취소/다시 실행을 지원하는 핵심 데이터 기반 문서 기반 응용 프로그램이 있습니다. 코어 데이터 내에서 수많은 작업을 수행하는 몇 가지 작업을 설정하고 beginUndoGrouping/endUndoGrouping을 통해 이러한 모든 작업을 실행 취소 그룹으로 랩핑하고 NSUndoManager가 처리합니다.코어 데이터가있는 NSUndoManager - 다시 실행되지 않음

실행 취소가 정상적으로 작동합니다. 몇 가지 연속적인 작업을 수행 할 수 있으며 각각의 작업을 연속적으로 실행 취소하고 앱의 상태가 올바르게 유지됩니다. 그러나 "다시 실행"메뉴 항목은 절대로 사용할 수 없습니다. 즉, NSUndoManager가 다시 실행할 항목이 없다는 것을 메뉴에 알리는 것입니다.

NSUndoManager가 실행 취소 된 항목에 대해 겉보기에 잊어 버리고 재실행을 허용하지 않는 이유가 궁금합니다.

내가 언급해야 할 것은 문서를 연/생성 한 후에 실행 취소 등록을 사용하지 않도록 설정한다는 것입니다. 작업을 수행 할 때 enableUndoRegistration, beginUndoGrouping으로 전화를 걸어 동작을 수행 한 다음 processPendingChanges, setActionName:, endUndoGrouping 및 마지막으로 disableUndoRegistration으로 전화를 겁니다. 이렇게하면 특정 동작 만 실행 취소 할 수 있으며,이 외의 다른 데이터 변경 사항은 NSUndoManager에 알려지지 않습니다. 이것은 문제의 일부일 수 있습니다. 그렇다면 왜 그것이 재실행에 영향을 미치는지 궁금합니다.

미리 감사드립니다. 나는이 문제를 해결 한

답변

1

:

상태 유지 취소 등록 내가 명시 적으로 실행 취소를 기록하고 싶지 않은 시간을 제외한 모든 시간을 사용 가능.

당신은 당신이 녹음하려는 변경을 수행하기 전에 등록을 취소 할 수 있도록하고, 변경 사항을 커밋 후 즉시 사용하지 않도록 설정하면

에서, NSUndoManager의 다시 실행 스택을 채워 결코 극복 :

나는 것을 배웠습니다.

따라서 disableUndoRegistration으로 전화하지 마십시오.

3

사실, -undo와 -redo (및 그 이후에있는 DisableUndoRegistration) 전에 enableUndoRegistration을 호출하는 한, 이후의 작업을 수행 할 수 있습니다.

귀하가 관리 대상 개체를 변경하기 전후에 실행 취소 (UndoRegistration) 만 호출했다고 생각합니다. 즉, '실행 취소'가 실행 취소 관리자에 등록되지 않았으므로 다시 실행할 수 없습니다.

1

"다시 실행"을 활성화 한 상태에서 disableUndoManager를 호출했습니다. 이를 위해 나는 NSUndoManager을 서브 클래스 및이 방법에 포함 : NSUndoManager, Core Data and selective undo/redo에 Stefanf에서 언급 한 바와 같이

-(void) undo 
{ 
    [[appDelegate managedObjectContext] processPendingChanges]; 
    [self enableUndoRegistration]; 
    [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]]; 
    [super undo]; 
    [[appDelegate managedObjectContext] processPendingChanges]; 
    [self disableUndoRegistration]; 
} 

을 :

"그 변경 사항을 등록 할 때까지 NSUndoManager 다음 실행 루프 사이클을 기다립니다"
관련 문제