我的应用程序还没有使用 Core Data。我必须使用 Core Data 来撤消/重做是真的吗?
以及:用户如何进行撤消/重做?我从未见过它的实际效果,也从未使用过它。如果我愿意,不知道该怎么做。任何地方都没有撤消/重做按钮。然而他们说它已经撤消/重做。那么用户如何触发呢?
最佳答案
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 上启用用于撤消的默认手势,即摇动设备。要让您的应用程序自动处理此手势,请将以下代码放入应用程序委托(delegate)的
-applicationDidFinishLaunching:
方法中:application.applicationSupportsShakeToEdit = YES;
最后,您需要设置每个 View Controller ,使其能够处理用于撤消的摇动手势。这些 View Controller 需要通过覆盖
-undoManager
方法来报告回用于该 Controller 的撤消管理器:- (NSUndoManager *)undoManager;
{
return [[[MyDatabaseController sharedDatabaseController] scratchpadContext] undoManager];
}
View Controller 还需要能够成为处理手势的第一响应者,因此需要以下方法:
- (BOOL)canBecomeFirstResponder
{
return YES;
}
当 View Controller 出现在屏幕上时,它需要成为第一响应者。这可以通过在
[self becomeFirstResponder]
或 -loadView
中调用 -viewDidLoad
来完成,但我发现启动后立即出现在屏幕上的 View Controller 需要稍微延迟此消息才能使其工作:[self performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.3];
有了这一切,你应该得到 Core Data 提供的自动撤消和重做支持,以及一个漂亮的动画菜单。
关于iphone - 撤消/重做基本上如何在 iPhone 操作系统上工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2449268/