2013-03-05 3 views
3
(코어 데이터와 함께 사용할 때)

NSUndoManager는 아이 NSManagedObjectContext 사용해야합니다 UIManagedDocument

해상도에 NSUndoManager 작동하지 자동 - 저장합니다. 이는 이 어느 시점에서든 자동 저장 될 수 있기 때문에 undo은 아무런 영향을 미치지 않기 때문입니다. 따라서 자식 컨텍스트에서 동일한 결과를 얻을 수 있기 때문에 NSUndoManager을 사용하여 저장/취소 기능을 구현할 필요가 없습니다.

NSUndoManager은 자식 컨텍스트보다 구현하기가 훨씬 쉽기 때문에 슬픈 비트입니다 (후자의 경우 부모에게 자식을 객체로 복사하는 데는 existingObjectWithID). 개인적으로 나는 groupingLevel != 0 인 경우 문서를 자동 저장하지 않아야한다고 생각했을 것입니다. Rant가 끝났어.

원래의 질문에

나는로드 데이터가 UIManagedDocument에 코어 데이터를 사용하여 테이블 뷰 컨트롤러가 있습니다. 뷰 컨트롤러와 연결하여 테이블의 각 행을 편집합니다. 보기 컨트롤러에서 나는 취소 버튼을 저장했습니다. 내 NSManaged 개체 (self.list 아래)의 범주를 통해 NSUndoManager을 사용하여 취소 기능을 구현합니다.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.list beginEdit]; 
} 

- (IBAction)cancel:(id)sender 
{ 
    [self.list cancelEdit]; 
    [self close]; 
} 

- (IBAction)save:(id)sender 
{ 
    [self.list endEdit]; 
    [self close]; 
} 

범주는 beginEdit, endEdit과 NSUndoManager 물건을 처리하기위한 cancelEdit을 구현합니다. 아래의 코드에서 useUndo은 NSUndoManager 사용의 영향을보기 위해 NO 또는 YES로 설정 한 상수입니다.

- (void)beginEdit 
{ 
    if (useUndo) 
    { 
     NSUndoManager *undoManager = [[NSUndoManager alloc] init]; 
     self.managedObjectContext.undoManager = undoManager; 
     [undoManager beginUndoGrouping]; 
    } 
} 

- (void)endEdit 
{ 
    [self.managedObjectContext save:nil]; 
    if (useUndo) 
    { 
     NSUndoManager *undoManager = self.managedObjectContext.undoManager; 
     [undoManager endUndoGrouping]; 
     self.managedObjectContext.undoManager = nil; 
    } 
} 

- (void)cancelEdit 
{ 
    if (useUndo) 
    { 
     NSUndoManager *undoManager = self.managedObjectContext.undoManager; 
     [undoManager endUndoGrouping]; 
     [undoManager undo]; 
    } 
} 

내가 객체를 저장할 때 홈 버튼 useUndo = NO을 클릭하면 핵심 데이터 디버그 메시지가 변경 사항을 저지르고 보여주는 볼 수 있습니다. 그러나 useUndo = YES을 사용하면 홈 버튼을 클릭 할 때 자동 저장되지 않습니다. 나는 몇 분을 기다렸다. 그리고 그것은 자동 저장하지 않는다. 자동 저장을 강제 할 수있는 방법이 있습니까?

누구나 undoManager를 사용하면 왜이 동작이 변경되는지 설명 할 수 있습니까?

내가 잘못된 방향으로 가고 있거나 코드에 간단한 문제가있는 것으로 의심됩니다. 어떤 도움을 주시면 감사하겠습니다.

+0

우선, UIManagedDocument를 사용할 때'[self.managedObjectContext save : nil]'(childContext가 아닌 경우)를 호출하지 마십시오. . UIManagedDocument 객체에 항상 updateChangeCount :를 호출해야한다. 참고 자료 : [Managed Document의 Managed Object Context 사용하기] (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIManagedDocument_Class/Reference/Reference.html) –

답변

1

그것이 맞는지는 모르겠지만 stackoverflow의 다른 답변은 NSUndoManager가 컨텍스트가 저장 될 때 실행 취소 스택을 지웠다 고 언급했습니다. 즉, 자동 저장과 함께 실행 취소 관리자를 사용하면 몇 초 동안 (자동 저장 간격이 무엇이든) 최대 유용합니다. 거기에 연결이있을 수 있습니다. 더 자세히 알아 내려고 노력 중입니다 ...

+0

흥미 롭다 - 나는 다른 행동과 일치한다. 실행 취소 그룹을 시작하고 변경 사항을 확인한 다음 실행 취소를 수행합니다. 때로는 자동 저장이 시작과 실행 취소 사이에서 발생하기 때문에 실행 취소는 아무 것도 취소하지 않습니다. 이것은 쓸모없는 것보다 적습니다! 이 행동이 의도적으로 어떤 구체적인 증거라도 도움이 될 것입니다. NSUndoManager에서 실행 취소 스택이나 Apple doco의 내용을 지우는 다른 답변을 찾을 수 없습니다. – Michael

+0

정보가 더 있습니다. 관리되는 문서는 자체적으로 두 개의 컨텍스트 만 자동 저장하므로 잘못된 시간에 자동 저장되지 않도록 자체 하위 컨텍스트를 만들어야합니다. 그런 다음 컨텍스트를 수동으로 저장하십시오.즉, 실행 취소 관리자가 핵심 데이터 작업에 대해서만 사용자의 실행 취소 스택을 관리한다고 생각하지 않습니다. – Andreas

+0

나에게 맞는 점은 NSUndoManager를 사용하려는 경우 자식 컨텍스트에 있어야한다는 것입니다. 따라서 요구 사항이 진정한 실행 취소/다시 실행과 반대되는 저장/취소를 지원하는 것일뿐 아니라 자식 컨텍스트를 저장하거나 삭제하여 NSUndoManager를 사용할 때 가치가 없습니다. 나는 당신의 답을 옳은 것으로 표시 할 것입니다. – Michael