由于NSUndoManager,NSDocument在保存后被标记为脏 - 为什么?

时间:2015-12-07 17:47:04

标签: objective-c nsdocument nsundomanager

所以我在updateChangeCount:(NSDocumentChangeType)changeType设置了断点,以查看我的文档被标记为脏的时间。

保存文档后,使用NSChangeCleared正确清除文档,然后使用NSChangeDone调用后立即清除更改后的计数。

以下是该调用的堆栈跟踪:

    0   SS                                  0x000000010000764a -[SSDocument updateChangeCount:] + 42
    1   AppKit                              0x00007fff94fdcdac -[NSDocument _changeWasDone:] + 458
    2   CoreFoundation                      0x00007fff9c415c9c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
    3   CoreFoundation                      0x00007fff9c415c2f ___CFXRegistrationPost_block_invoke + 63
    4   CoreFoundation                      0x00007fff9c415ba7 _CFXRegistrationPost + 407
    5   CoreFoundation                      0x00007fff9c415912 ___CFXNotificationPost_block_invoke + 50
    6   CoreFoundation                      0x00007fff9c3d26d2 -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1922
    7   CoreFoundation                      0x00007fff9c3d1925 _CFXNotificationPost + 693
    8   Foundation                          0x00007fff9b72b0fa -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
    9   Foundation                          0x00007fff9b7ba4ad -[NSUndoManager _endUndoGroupRemovingIfEmpty:] + 535
    10  Foundation                          0x00007fff9b79b06b +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 484
    11  AppKit                              0x00007fff94bd7dca -[NSApplication run] + 844

我没有以任何方式配置NSUndoManager。关于如何防止这种情况发生的任何建议?

这是一个问题,因为用户可以保存文档,关闭窗口,然后要求他们再次保存。

1 个答案:

答案 0 :(得分:2)

  

撤消操作通常在撤消组中收集。 NSUndoManager通常在运行循环期间自动创建撤消组。第一次要求在运行循环中记录撤消操作时,它会创建一个新组。然后,在循环结束时,它会关闭该组。

您可以通过调用-[NSUndoManager disableUndoRegistration]-[NSUndoManager enableUndoRegistration]暂时停用撤消操作。您可以使用-[NSUndoManager removeAllActions]删除所有撤消操作。