//编辑:真的,没有人对此有任何建议或想法吗?我是否以某种方式错误地问了这个问题?//

我的iPhone应用程序具有一个带有中等复杂数据模型的managedmanagedContext。我现在要添加撤消功能,并且尚不清楚如何最好地处理嵌套的viewController(因为每一层都可能会修改数据模型)。



那么,实现此目标的最佳方法是什么?目前,我正在考虑让每个viewController保留自己的undoManager,只要它在屏幕上就会激活。因此,我的理解是,这将需要以下步骤(对于每个VC):

  • 添加属性:myUndoManager
  • 添加一个undoManager方法,返回myManagedObjectContext.undoManager;
  • viewDidAppear中:myManagedObjectContext.undoManager = myUndoManager;//如果没有则创建第一个
  • viewWillDisappear中:myManagedObjectContext.undoManager = nil;
  • 关于内存警告:[self.undoManager removeAllActions ];
  • 解除分配时:self.myUndoManager = nil;
  • 对于每个模型更改:[self.undoManager setActionName:NSLocalizedString(@“XXX”,@“”)];
  • CoreData将处理实际的撤消/重做发布

  • 另外,我必须保留firstResponder:
  • viewDidAppear中:`[self成为FirstResponder]'
  • 添加返回YES的canBecomeFirstResponder方法
  • viewWillDisappear中:[self resignFirstResponder];
  • 在 subview 辞职时重新启用firstResponder(例如textFields)

  • 到目前为止,即使在整个加载/卸载周期中,它似乎都可以正常运行,并且完全是自包含的,但是我有几个问题:
  • 首先,这是跨多个VC实现撤消操作的最佳实践吗?
  • 我的 child VC在做之前的VC之前不做撤消会遇到麻烦吗?
  • 如果是,该列表是否捕获了我需要做的所有事情?
  • ManagedObjectContext是否会与多个UndoManager处于事件状态混淆?
  • 交换undoManager之前是否需要调用ProcessPendingActions?
  • 最佳答案

    每个 View Controller 可以具有自己的撤消管理器。 Controller 应仅对直接更改的字段负责。一旦退出相应的 View ,就应释放 Controller 并随其一起撤消管理器。

    假设您有3个等级。级别1代表整个记录,级别2代表来自级别1的数据子集,级别3代表来自级别2的数据子集。

    当您退出第3级时,您基本上已经说过我接受,并且您不需要撤消第2级中的任何数据。如果更改后的数据仅在第2级中显示为只读数据,显示所有。同样,一旦您退出2级,则应释放其撤消管理器。

    回到第1层,因为它代表了整个记录,为什么不使用“取消”按钮而不是尝试撤消(或另外,取决于您的第1层 Controller 的功能)呢?

    然后,如果要取消所有操作,可以向托管对象上下文发送如下消息:

    [myMOC refreshObject:theEditedObject mergeChanges:NO];
    

    这将有效地回滚整个记录

    如果出于某种原因,您决定在处于第2级的同时保留第3级的撤消管理器,并在第2级进行回滚,则只会回退与第2级的撤消管理器有关的数据。级别3的撤消管理器是单独的,并且核心数据不会将撤消管理器视为嵌套的。

    受管对象上下文不会因多个撤消管理器而感到困惑,因为它只能通过其setUndoManager:方法一次跟踪一个。

    您可能不需要使用processPendingChanges,除非进行更改后以某种方式在事件循环完成之前进行了回滚。除非您的撤消操作仅还原到那时应该由撤消管理器记录的一些数据,否则我不会为此担心。

    关于iphone - 可以将多个NSUndoManager与一个Core-Data ManagedObjectContext一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4980620/

    10-09 14:29