撤销/重做如何基本上在iPhone OS上工作?

我的应用程序还没有使用核心数据。 是真的,我必须使用核心数据撤销/重做?

而且:用户如何做撤销/重做? 我从来没有看到它的行动,从来没有使用它。 不知道我应该怎么做,如果我想。 没有任何撤消/重做button。 然而他们说它有撤销/重做。 那么用户如何触发呢?

iPhone OS 3.0从Mac引入了NSUndoManager的概念,这是在iPhone上启用撤销的function。 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"]; } 

可以用来观察属性的变化,创build相反的NSInvocations,将撤消对这些属性的编辑。

核心数据不需要撤消,但它使得它更容易,更容易。 它会在您每次编辑数据模型时为您处理这些撤消操作的创build,包括复杂的操作,例如级联删除,pipe理对象的层次结构。

在iPhone上,要启用撤销/重做,您需要设置一些东西。 首先,iPhone上的NSManagedObjectContexts默认情况下没有撤销pipe理器,所以你需要创build一个:

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

这段代码通常会在你创buildNSManagedObjectContext的地方后面。

一旦为你的上下文提供了一个撤消pipe理器,你需要在iPhone上启用默认的手势来撤销,这是一个设备的摇动。 要让应用程序自动处理此手势,请将以下代码放入应用程序委托中的-applicationDidFinishLaunching:方法内:

 application.applicationSupportsShakeToEdit = YES; 

最后,你将需要设置每个视图控制器,将能够处理摇动手势撤消。 这些视图控制器将需要通过覆盖-undoManager方法来报告用于该控制器的撤销pipe理器:

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

视图控制器也需要能够成为处理手势的第一响应者,所以需要以下方法:

 - (BOOL)canBecomeFirstResponder { return YES; } 

当视图控制器出现在屏幕上时,将需要成为第一响应者。 这可以通过在-loadView-viewDidLoad调用[self becomeFirstResponder]来完成,但是我发现在启动之后立即出现在屏幕上的视图控制器需要延迟这个消息以使其工作:

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

有了这一切,你应该得到自动撤消和重做支持Core Data的礼貌,一个很好的animation菜单。