我正在开发一个核心数据应用程序,它具有相当大的托管对象层次结构,类似于树。
创建基础对象时,它会创建一些子对象,这些子对象又创建自己的子对象,依此类推。这些子对象中的每一个都可以使用NSURLConnections收集信息。
现在,我想在managedObjectContext中使用undoManager支持undo / redo。问题是,如果用户创建基础对象,然后尝试撤消该操作,则不会删除基础对象。相反,可以移除一个或多个子对象。显然,这种行为是不可预测和不受欢迎的。
所以我尝试默认禁用撤消注册。我通过在managedObjectContext中修改任何内容之前调用disableUndoRegistration:
来完成此操作。然后,在基本操作(例如创建基础对象)之前启用撤消注册,再次重新禁用后续注册。
现在,当我尝试撤消时,我收到此错误:
撤消:NSUndoManager 0x1026428b0在 无效状态,撤消被调用 嵌套的撤销组太多了
思想?
答案 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将其撤消。
答案 2 :(得分:0)
我与NSUndoManager is in invalid state, undo was called with too many nested undo groups
的交集不涉及CoreData,但我的回答可能也是有用的。
在我的情况下,由于在调用NSUndoManager -undo期间引发的代码中的未捕获异常,引发了撤消管理器异常。
通过控制台回顾我可以看到我的应用程序代码异常和撤消管理器的NSInternalInconsistencyException。
我使用了默认的runloop撤销组行为,并没有明确地对我的撤销注册进行分组。