【问题标题】:NSUndoManager, Core Data and selective undo/redoNSUndoManager,核心数据和选择性撤消/重做
【发布时间】:2011-05-31 18:59:33
【问题描述】:

我正在开发一个核心数据应用程序,该应用程序具有相当大的托管对象层次结构,类似于树。

创建基础对象时,它会创建一些子对象,这些子对象又会创建自己的子对象,依此类推。这些子对象中的每一个都可以使用 NSURLConnections 收集信息。

现在,我想通过 managedObjectContext 中的 undoManager 支持撤消/重做。问题是,如果用户创建了一个基础对象,然后尝试撤消该操作,则不会删除该基础对象。相反,可以移除一个或多个子对象。显然,这种类型的操作是不可预测且不需要的。

所以我尝试默认禁用撤消注册。我通过在 managedObjectContext 中进行任何修改之前调用 disableUndoRegistration: 来做到这一点。然后,在基础操作(例如创建基础对象)之前启用撤消注册,然后再次重新禁用注册。

现在当我尝试撤消时,我收到此错误:

撤消:NSUndoManager 0x1026428b0 在 无效状态,撤消被调用 嵌套的撤消组太多

想法?

【问题讨论】:

    标签: cocoa core-data nsmanagedobject nsmanagedobjectcontext nsundomanager


    【解决方案1】:

    NSUndoManager 等待下一个运行循环周期,直到它注册您的更改

    // do your stuff
    
    // give the run loop a breath
    
    [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
    [undoManager disableUndoRegistration];
    

    【讨论】:

      【解决方案2】:

      这个问题发布已经一年多了,但无论如何这里有一个答案:

      您应该查看苹果的文档:

      .. 撤消消息关闭最后一个打开的撤消组,然后应用该组中的所有撤消操作...如果调用撤消时堆栈上有任何未关闭的嵌套撤消组,则会引发异常.要撤消嵌套组,您必须使用 endUndoGrouping 消息显式关闭组,然后使用 undoNestedGroup 撤消它。

      http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UndoArchitecture/Articles/PerformingUndo.html

      【讨论】:

        【解决方案3】:

        我与NSUndoManager is in invalid state, undo was called with too many nested undo groups 的交集不涉及CoreData,但我的回答可能仍然有用。

        在我的情况下,由于在调用 NSUndoManager -undo 期间引发了我的代码中未捕获的异常,引发了撤消管理器异常。

        通过控制台回顾我可以看到我的应用程序代码异常和撤消管理器的 NSInternalInconsistencyException。

        我使用了默认的 runloop 撤消组行为,并没有显式地将我的撤消注册分组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-03
          • 2012-02-12
          • 2011-01-26
          • 2013-01-17
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          相关资源
          最近更新 更多