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];
모든이와 함께 적절한 위치에서 자동으로 실행 취소 및 다시 실행을 지원해야합니다.