2010-03-15 2 views
12

내 앱에서 핵심 데이터를 아직 사용하지 않습니다. 코어 데이터를 사용하여 실행 취소/다시 실행해야합니다.iPhone OS에서 실행 취소/다시 실행은 기본적으로 어떻게 작동합니까?

그리고 : 사용자가 실행 취소/다시 실행을 어떻게 수행합니까? 나는 그것을 본 적이 한번도 본 적이 없다. 내가 원한다면 어떻게해야하는지 모르겠다. 아무 곳에서도 실행 취소/다시 실행 버튼이 없습니다. 그러나 그들은 그것이 실행 취소/다시 실행이라고 말한다. 그러면 사용자가 어떻게 트리거합니까?

답변

35

iPhone OS 3.0은 Mac에서 NSUndoManager의 개념을 가져 왔습니다. 이것이 iPhone에서 실행 취소를 가능하게합니다. NSUndoManager는 NSInvocations의 스택을 유지하는데, 이것은 편집이나 다른 변경 사항에 대한 반대 동작입니다. 예를 들어,

- (void)observeValueForKeyPath:(NSString*)keyPath 
         ofObject:(id)object 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    NSUndoManager *undo = [self undoManager]; 
    // Grab the old value of the key 
    id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; 
    // Add edit item to the undo stack 
    [[undo prepareWithInvocationTarget:self] changeKeyPath:keyPath 
                ofObject:object 
                toValue:oldValue]; 
    // Set the undo action name in the menu 
    [undo setActionName:@"Edit"]; 
} 

은 속성의 변경 사항을 관찰하고 이러한 속성에 대한 편집을 취소 할 역 NSInvocations를 만드는 데 사용할 수 있습니다.

코어 데이터는 실행 취소에 필요하지 않지만 훨씬 쉽게 만듭니다. 관리 객체의 계층 구조를 단계적으로 삭제하는 것과 같은 복잡한 작업을 포함하여 데이터 모델을 편집 할 때마다 이러한 실행 취소 작업의 생성을 처리합니다.

iPhone에서 실행 취소/다시 실행을 사용하려면 몇 가지 사항을 설정해야합니다. 첫째, 아이폰에 NSManagedObjectContexts은 기본적으로 실행 취소 관리자가없는, 그래서 당신은 하나를 만들어야합니다

NSUndoManager *contextUndoManager = [[NSUndoManager alloc] init]; 
[contextUndoManager setLevelsOfUndo:10]; 
[managedObjectContext setUndoManager:contextUndoManager]; 
[contextUndoManager release];  

이 코드는 당신이 당신의 NSManagedObjectContext 만든 것 인 직후에 갈 일반적으로 것입니다.

일단 실행 취소 관리자가 컨텍스트에 제공되면 iPhone에서 실행 취소를위한 기본 제스처 (장치 흔들림)를 활성화해야합니다. 마지막으로

application.applicationSupportsShakeToEdit = YES; 

, 당신을 위해 흔들기 동작을 처리 할 수 ​​각 뷰 컨트롤러를 설정해야합니다 : 응용 프로그램이 자동으로이 제스처를 처리하는 응용 프로그램 위임에 -applicationDidFinishLaunching: 방법 내에서 다음 코드를 넣도록 끄르다.

- (NSUndoManager *)undoManager; 
{ 
    return [[[MyDatabaseController sharedDatabaseController] scratchpadContext] undoManager]; 
} 

컨트롤러는 동작을 처리 할 수있는 첫 번째로 반응이 될 수 있어야합니다, 그래서 것보기는

다음이보기 컨트롤러는 -undoManager 방법을 재정 의하여 해당 컨트롤러에 사용할 실행 취소 관리자를 다시보고해야합니다 방법이 필요합니다 :

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

보기 컨트롤러가 화면에 나타나면 첫 번째 응답자가되어야합니다. 이것은 -loadView 또는 -viewDidLoad에서 [self becomeFirstResponder]를 호출하여 수행 할 수 있습니다,하지만 난 즉시 출시 후 화면에 표시되는 뷰 컨트롤러가 작동하려면이 메시지가 순서대로 약간의 지연이 필요합니다 것으로 나타났습니다 :

[self performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.3]; 

모든이와 함께 적절한 위치에서 자동으로 실행 취소 및 다시 실행을 지원해야합니다.

관련 문제