2009-04-23 3 views
8

내 핵심 데이터 모델에는 각각 listItem 엔티티로 연결되는 listItems이라는 관계가 있습니다 (각각 stringValue 속성이 있음). 기본적으로 각 목록 항목에 대해 NSTextFields의 목록 인 컨트롤을 만들었습니다. 컨트롤이 listItems에 제대로 바인딩되어 있고 반환 키를 누르면 현재 편집 된 필드 바로 아래에 새 필드가 만들어지고 새 필드로 포커스가 변경되도록 설정했습니다. 따라서 기본적으로 새 항목을 추가하려면 사용자가 Return 키를 누릅니다.NSManagedObject의 생성/삭제에 대한 실행 취소 사용 안 함

마찬가지로 사용자가 편집을 끝내고 현재 편집 된 입력란이 비어있는 경우 입력란이 삭제됩니다 (비어있는 입력란은 '편집 모드'중에 만 표시되므로 말하기). 이것은 꽤 잘 작동합니다. 기본적으로, 내 listItem NSManagedObject 하위 클래스에서, 나는 다음을 수행하십시오

// Don't allow nil values 
if (!value && [[self.recipe ingredients] count] > 1) { 
    for (EAIngredientRef *ingredient in [self.recipe ingredients]) { 
     if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) { 
      [ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]]; 
     } 
    } 
    [[self managedObjectContext] deleteObject:self]; 
    return; 
} 

// Code to handle if it is a real value 

I가 발생하고 문제가 행이이 방법으로 삭제 될 때마다, 그것은를 UndoManager에 등록한다는 것입니다. 따라서 행을 편집하고 Return (새 행 작성)을 누른 후 편집을 끝내려면 클릭하여 행이 사라집니다. 그러나 실행 취소하면 빈 필드가 다시 나타납니다. 내 목표는 빈 필드를 포함하는 삭제 작업을 undoManager가 무시하도록하는 것입니다.

어떻게하면됩니까? 내가 [[[self managedObjectContext] undoManager] disableUndoRegistration] 여러 지점에서 관련 enableUndoRegistration 사용하려고했습니다 (-didTurnIntoFault 등을,하지만 난 실행 취소 등록하는 방법 이전에 발생 될 수 있음을 의심)는 코어 데이터 워드 프로세서로 더 깊이 잠수하면

답변

18

, 당신 ' 찾아 낼 것이다이 재미있는 이야기가 숨겨져 :

[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] disableUndoRegistration]; 
// Do your work 
[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] enableUndoRegistration]; 

의 변화는 일반적으로 이벤트 루프가 끝날 때까지 실행 취소 관리자와 등록되지 않은, 그래서 당신이 다시 취소 등록되어 줄 후 등록되고 있었다. 위의 경우 원하는 때 발생합니다.