我的应用程序尚未使用核心数据。我真的必须使用核心数据撤销/重做?撤销/重做如何基本上在iPhone OS上工作?
并且:用户如何做撤销/重做?我从来没有看到它的行动,并从未使用它。如果我想,我不知道该怎么做。没有任何撤消/重做按钮。但他们说它有撤销/重做。那么用户如何触发这个呢?
我的应用程序尚未使用核心数据。我真的必须使用核心数据撤销/重做?撤销/重做如何基本上在iPhone OS上工作?
并且:用户如何做撤销/重做?我从来没有看到它的行动,并从未使用它。如果我想,我不知道该怎么做。没有任何撤消/重做按钮。但他们说它有撤销/重做。那么用户如何触发这个呢?
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上,要启用撤销/重做,您需要设置一些东西。首先,在iPhone NSManagedObjectContexts没有默认的撤消管理器,所以你需要创建一个:
NSUndoManager *contextUndoManager = [[NSUndoManager alloc] init];
[contextUndoManager setLevelsOfUndo:10];
[managedObjectContext setUndoManager:contextUndoManager];
[contextUndoManager release];
此代码通常你会建立在您的NSManagedObjectContext后右转。
一旦为您的上下文提供了撤消管理器,您需要在iPhone上启用默认手势以撤销,这是设备的摇晃。为了让你的应用程序会自动处理这个手势,将-applicationDidFinishLaunching:
方法中下面的代码在您的应用程序委托:
application.applicationSupportsShakeToEdit = YES;
最后,你需要建立一个将能够处理的摇晃手势为每个视图控制器撤消。这些视图控制器需要报到撤消管理器通过重写-undoManager
方法使用该控制器:
- (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的礼貌,并带有一个漂亮的动画菜单。