NSUndoManager,核心数据和选择性撤消/重做

时间:2010-12-28 21:51:19

标签: cocoa core-data nsmanagedobject nsmanagedobjectcontext nsundomanager

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

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

现在,我想在managedObjectContext中使用undoManager支持undo / redo。问题是,如果用户创建基础对象,然后尝试撤消该操作,则不会删除基础对象。相反,可以移除一个或多个子对象。显然,这种行为是不可预测和不受欢迎的。

所以我尝试默认禁用撤消注册。我通过在managedObjectContext中修改任何内容之前调用disableUndoRegistration:来完成此操作。然后,在基本操作(例如创建基础对象)之前启用撤消注册,再次重新禁用后续注册。

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

  

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

思想?

3 个答案:

答案 0 :(得分:6)

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

// do your stuff

// give the run loop a breath

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];

答案 1 :(得分:5)

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

你应该查看苹果的文档说明:

  

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

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

答案 2 :(得分:0)

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

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

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

我使用了默认的runloop撤销组行为,并没有明确地对我的撤销注册进行分组。