如何在结束组之前处理组内的撤消操作

时间:2016-03-14 20:52:04

标签: macos cocoa foundation undo nsundomanager

我想要分组几个撤消操作。

用户将在应用程序中输入状态,并开始修改对象 我需要beginUndoGrouping开始,
然后,每次修改对象时,都会向堆栈添加一个操作。

当用户退出此状态时,我需要endUndoGrouping。 因此,当超出此特定状态时,用户可以立即撤消所有操作。

问题是,他们处于这种状态,我也希望用户能够单独撤消每个操作。

这是一个问题因为我已经开始撤消分组了 每次发送-undo消息时都会收到此异常:

2016-03-14 16:42:08.044 Snagit[6778:7933371] undo: NSUndoManager 0x610000286ef0 is in invalid state, undo was called with too many nested undo groups

我看到它的方式,我有几个选择。

1)找到一种方法来撤消上一个顶级操作而不撤消父组(根据API,理论上这可以通过调用undoNestedGroup来实现。但是,目前还不清楚我将如何实施这个解决方案。
编辑经过一些测试后,我认为此选项不起作用。我尝试以编程方式调用undoNestedGroup,然后结束撤消组,我仍然得到异常

2)生活中抛出异常。它不会导致崩溃,也不会发生撤消。

,当抛出此异常时,撤消堆栈不会更改,因此它似乎不是问题。

3)重新思考我如何对撤消操作进行分组。一个例子可能是跟踪撤销堆栈上的操作数量。不要在开始时开始撤销组,而是在结束时以某种方式手动创建新的撤消组并将适当数量的撤消操作放入组中。这个解决方案虽然看起来很可怕。

EDIT2 :这是我undo时撤消堆栈并抛出异常:

0: target: ImageController 0x608000168b80 -- selector:setCanvasRect:
1: endUndoGrouping
2: beginUndoGrouping  
3: beginUndoGrouping  

注意有一个空组,也许这可能导致问题,但我真的不知道如何。不应undo添加必要的endUndoGrouping,这样会好吗?

EDIT3 设置groupsByEventNO会删除该空组。

撤消堆栈现在看起来像这样:

0: target: ImageController 0x600000164800 -- selector:setCanvasRect:
1: beginUndoGrouping  

按下撤消时,仍然会出现异常

2016-03-15 16:40:49.560 Snagit[78079:8308950] undo: NSUndoManager 0x608000097a70 is in invalid state, undo was called with too many nested undo groups

所以我似乎缺少让undo自动结束撤销组的东西?

0 个答案:

没有答案