有没有一种方法可以查看撤销堆栈?

5
我正在学习撤销操作,并希望能够查看undoManager中的撤销对象(NSInvocation),以便了解当前的操作。我在文档中没有找到这样的内容,但也许有人知道如何实现。
谢谢。
3个回答

5

您可以使用

class-dump -C NSUndo /System/Library/Frameworks/Foundation.framework/Foundation

了解撤销相关类的内部结构,你会发现NSUndoManager有两个实例变量名为_undoStack和_redoStack。它的结构非常明显,因此你可以编写一个小方法来打印堆栈。我发现这对于调试与撤销相关的问题非常有用。


4
谢谢回答。对于任何想知道什么是class-dump的人(比如我),我在这里找到了它:http://www.codethecode.com/projects/class-dump/ - nevan king

1

你正在使用Core Data吗?Core Data提供自动撤销/重做支持。否则,NSUndoManager将没有任何堆栈。

我想问你的问题是,为什么你想查看堆栈?实际上,你没有必要查看撤销管理器的堆栈。如果你正在寻求如何创建撤销操作并将它们推送到堆栈上的建议,这里有一个相当不错的概述苹果的文档也非常好。我特别喜欢基于调用的方法。


我正在学习《Cocoa Programming for Mac OS X》,其中有一章介绍如何使用撤销功能,但它还没有使用Core Data。我想查看堆栈的原因只是为了更好地了解工作原理,以便确保实际发生的事情与我认为发生的事情相匹配。 - nevan king

1
您可以打印出您的撤销管理器的_undoStack私有属性:
let undoStack = object_getIvar(undoManager, class_getInstanceVariable(UndoManager.self, "_undoStack")!)

print(undostack.debugDescription)

基于这个代码片段


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接