Iphone 使用CoreData的嵌套撤消组

Iphone 使用CoreData的嵌套撤消组,iphone,core-data,nsundomanager,Iphone,Core Data,Nsundomanager,我想在coredata支持的iphone应用程序中添加一个撤销管理器。当用户尝试添加新对象时(通过点击+按钮),我将加载一个新的模态viewcontroller,并在viewDidLoad中启动一个新的撤消组 当用户按下Cancel按钮时,我想回滚cancelAction回调中的更改 查询: 是否可以启动一个嵌套的撤消组,并通过事件循环将其持久化,并整理单个撤消组中所做的所有更改?现在,当我在cancelAction中调用beginUndoGrouping时,我得到一个缺少的beginUndoG

我想在coredata支持的iphone应用程序中添加一个撤销管理器。当用户尝试添加新对象时(通过点击+按钮),我将加载一个新的模态viewcontroller,并在viewDidLoad中启动一个新的撤消组

当用户按下Cancel按钮时,我想回滚cancelAction回调中的更改

查询:

  • 是否可以启动一个嵌套的撤消组,并通过事件循环将其持久化,并整理单个撤消组中所做的所有更改?现在,当我在cancelAction中调用beginUndoGrouping时,我得到一个缺少的beginUndoGrouping异常
  • groupsByEvent API对NSEndomanager的意义是什么?我是否需要将其设置为“否”才能通过事件循环持久化撤消组
  • 在saveAction回调中需要做什么才能使更改永久化(除了在mangedObjectContext上调用save)?如何让撤消管理器停止跟踪更改
  • 错误消息:

    *由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“\u endUndoGroupRemovingIfEmpty::NSUndoManager 0x75415f0处于无效状态,调用endUndoGrouping时没有匹配的开始

    示例代码:

    // RootViewController.m
    - (void) addAction {
       // Load Modal View Controller to add new object
    
    }
    
    // AddViewController.m
    - (void) viewDidLoad {
       // Start nested undo group
       [self.managedObjectContext processPendingChanges];
       [self.managedObjectContext.undoManager beginUndoGrouping];
    
       [self createModel];
    
    }
    
    - (void) cancelAction {
        // Revert all changes
        [self.managedObjectContext processPendingChanges];
        [self.managedObjectContext.undoManager endUndoGrouping];
    
        [self.managedObjectContext.undoManager undoNestedGroup];
    
        ...
    }
    
    - (void) saveAction {
    
        // Save changes
    }
    

    从您的具体问题开始-是的,您可以使用beginUndoGrouping和endUndoGrouping手动定义撤消操作的边界

    在这种情况下,无论是否设置了groupsByEvent,撤消操作都应该有效。这是因为事件循环生成的所有撤消组都嵌套在以beginUndoGrouping开始的主打开撤消分组下,只要在调用endUndoGrouping后直接调用undoNestedGroup,它就应该可以工作。如果您没有使用事件循环撤消分组,请不要担心,将其设置为否

    要使更改永久化,请使用endUndoGrouping关闭撤消组,并在上下文中调用save。processPendingChanges调用不是必需的,可能会导致嵌套组中出现问题。如果要清除撤消操作,请在endUndoGrouping之后在undomanager上调用removeAllActions-这保证了更改永远不会取消

    使用断点/nslog确保开始/结束调用是一对一的

    如果希望取消操作类似于“撤消按钮”,则必须执行以下操作:

    • 将beginUndoGrouping移动到视图将出现

    • 调用视图中的endUndoGrouping将消失

    • 在取消操作结束时重新打开撤消分组

    • 在保存操作结束时重新打开撤消分组

    否则,如果保持原样,请确保关闭“保存”和“取消”操作中的对话框,以避免多次调用endUndoGrouping

    如果你有任何问题,请评论,我会更新

    祝你好运