8

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

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

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

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

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

撤消:NSUndoManager 0x1026428b0 处于无效状态,撤消调用嵌套撤消组太多

想法?

4

3 回答 3

6

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

// do your stuff

// give the run loop a breath

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];
于 2011-01-29T13:58:16.153 回答
5

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

您应该查看它说的苹果文档:

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

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

于 2012-01-06T13:48:33.320 回答
0

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

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

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

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

于 2012-12-28T13:44:28.903 回答