2009-10-20 6 views
0
- (void)cancel { 
// [managedObjectContext.undoManager disableUndoRegistration]; 
    [managedObjectContext deleteObject:object]; // I don't want this deletion to be recorded on the undo stack which is empty at this point. 
// [managedObjectContext.undoManager enableUndoRegistration]; 
    [managedObjectContext.undoManager removeAllActions]; 
} 

이 코드를 사용하면 여전히 실행 취소 스택에서 삭제가 발생합니다.이 두 줄의 주석 처리를 제거해도 기록을 막을 수는 없습니다. 왜?이 코드가 실행 취소 스택을 비우지 못하는 이유

답변

2

실행 취소 처리를 실행 중지 한 후 다시 사용하기 전에 관리 대상 오브젝트 컨텍스트에서 -processPendingChanges를 호출해야합니다. 코어 데이터는 processPendingChanges가 동일한 속성 및 유사한 바로 가기에 대해 여러 변경 사항을 통합 할 수있을 때까지 실행 취소 이벤트를 등록하는 것을 지연합니다.

0

전화 - 캔슬이란 무엇입니까? 다른 메소드가 실행 취소 이벤트를 등록하는 상황이 발생했습니다 (코어 데이터는 "도움이 될"수 있습니다). 실행 취소 스택은 -cancel의 끝에서 비어 있지만 호출하는 메소드에 의해 추가 된 이벤트를 얻습니다.

이러한 경우에는 "실행 취소"를 선택해도 실제로는 아무 것도하지 않고 이벤트를 실행 취소 할 수 없습니다. 이러한 불필요한 이벤트를 방지하려면 호출 메소드에서 등록 취소를 비활성화 한 다음 다시 활성화해야합니다. 이것으로 너무 멀리 탐구하기 전에의 라인을 따라 뭔가 ...

- (void)doSomething { 
    // Disable undo until we definitely want to undo stuff 
    [managedObjectContext.undoManager disableUndoRegistration]; 

    // Stuff goes here 

    if (userCancelled) { 
     [self cancel]; 
     [managedObjectContext.undoManager enableUndoRegistration]; 
     return; 
    } 

    // We actually want user to be able to undo the following stuff 
    [managedObjectContext.undoManager enableUndoRegistration]; 

    // More stuff goes here 
} 

몇 가지 간단한 NSLog 때 (그리고 확인하기 위해 실행 취소 스택에 무엇인지를 확인 할 당신이 아니라 실제 라이브 NSUndoManager에 메시지를 보내는 확인 nil 객체보다).

+0

1. 버튼이 트리거됩니다. 2. 실행 취소를 시도하는 것을 제외하고 실행 취소 스택이 비어 있는지 어떻게 알 수 있습니까? 이 정보는 캡슐화되어 기록 할 수 없습니다. 3. 내 "실행 취소"가 삭제 작업을 실행 취소합니다. 4. 관리자를 실행 취소하지 않으시겠습니까? 아니, 물론이지. 하지만 상기시키는 것에 대해 감사드립니다. – an0

관련 문제