删除WebView的NSUndoManager的撤消操作

时间:2011-11-29 23:18:29

标签: cocoa webkit webview appkit nsundomanager

我有几个WebView,我交换进出视图层次结构。其中一些WebView包含表单字段,因此我实现了editingDelegate为我的文档提供NSUndoManager。

问题是在WebView中完成的任何输入都会生成放置在撤消堆栈上的操作。从层次结构中删除视图后,操作仍在撤消堆栈中。此时,如果用户使用Cmd-Z“撤消键入”,则会抛出异常,因为-undoEditing:正被发送到WebEditorUndoTarget的解除分配的实例。 (WebKit实现中使用的私有类。)

我不能使用-removeAllActionsWithTarget:因为我无法引用目标。似乎唯一的解决方案是禁用WebView的撤销注册。

我错过了什么或者这是WebView的限制吗?

3 个答案:

答案 0 :(得分:1)

在我看来,WebView应该负责从WebView的undoManager中删除自身或任何子服务对象:在这种情况下,你的。

从您的描述来看,它不是这样做的。我怀疑你找到目标所以你可以明确地删除它的目标将毫无结果,所以我想提出另一个解决方案,我以前使用过,或者我在这条路上走得太远以至于考虑使用; )

我对这种情况的想法是使用NSUndoManager的自定义子类,它能够保留其自身的所有注册的冗余内存(通过覆盖registerUndoWithTarget:...和prepareWithInvocationTarget)。通过可信赖的所有注册,您可以随时实施自己的清洁政策。即你可能会说“如果目标的类来自我不拥有的框架,只需删除它”......或者更具体一点,并说你要删除任何与WebEditorUndoTarget类匹配的东西。

答案 1 :(得分:1)

一个私有API解决方案是调用 - [WebView _clearUndoRedoOperations]。尚未找到公共API解决方案。

答案 2 :(得分:0)

上次我检查NSUndoManager时有方法- (void)removeAllActions。无需指定行动目标。