2009-08-07 4 views
12

iPhone에서 코어 데이터를 사용하여 실행 취소 지원을 구현하려고하는데 몇 가지 문제가있었습니다.코어 데이터로 관리 취소

현재 관리 개체가 두 개 설정되어 있지만 속성을 변경할 때 이러한 변경 내용은 실행 취소 관리자에 의해 기록되지 않습니다. 내 이해에서 핵심 데이터가 자동으로 설정되어 있어야하고 내가 관리 개체의 변경, 생성 및 삭제에 대한 기본적인 실행 취소 및 다시 실행 지원을 가질 수 있어야합니다.

개체를 변경하여 실행 취소 관리자가 기록하도록하는 특별한 방법이 있습니까? 또는 각 변경 사항에 대해 실행 취소 작업을 등록해야합니까?

또한 애플리케이션이 특정 개체를 편집하기위한 상세보기로 슬라이드한다고 가정합니다. 취소 버튼을 누르면 모든 변경 사항을 취소 할 수 있습니다. 여기에서 그룹핑을 취소 할 수 있습니까? 그룹을 커밋하는 것과 다른 실행 취소 관리자가 세부적인보기에서보다 미세한 작업을 관리하는 것과 실행 취소 관리자 (관리 대상 개체 컨텍스트에 포함 된 관리자)를 하나만 사용하는 것의 차이점은 무엇입니까?

감사합니다.

답변

24

실행 취소 기능은 거의 그대로 작동하지만 실행 취소 지원을 원하는 NSManagedObjectContext에 대해 NSUndoManager를 할당해야합니다.

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 

보고 그것을 수정 :

이 작업을 수행하는 가장 쉬운 방법은 뭔가 NSManagedObjectContext

이 사과는 당신이 제공하는 기본 방법에 대한 AppDelegate에 요청하면 실행 취소 지원을 설정하는 것입니다 같은 :

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     //Undo Support 
     NSUndoManager *anUndoManager = [[NSUndoManager alloc] init]; 
     [managedObjectContext setUndoManager:anUndoManager]; 
     [anUndoManager release]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 
+0

감사 벤 +1, 아름다운 간결한 대답 –

+0

나는 내 코드에서 실행 취소 관리자의 생성 또는 설정이 아직 당 작업을 취소하지 않는다 fectly. 관리 객체 컨텍스트에는 이미 실행 취소 관리자가 있습니다. 모두가해야 할 일은 윈도우 델리게이트가 다음과 같은 것을 구현하도록하는 것입니다 :'- (NSUndoManager *) windowWillReturnUndoManager : (NSWindow *) window { return [[DB managedObjectContext] undoManager]; }'. –

+2

@ IvanVučica이 사실은 OSX 프레임 워크로 작업 할 때 그렇습니다.하지만 iOS 프레임 워크로 작업 할 때 NSWindow와 같은 것은 없으며 가벼운 가중치 때문에 관리 대상 객체에는 실행 취소 관리자가 제공되지 않습니다. – Intentss

관련 문제