我的应用程序还没有使用 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/

10-13 09:32