删除 Web 视图的 NSUndoManager 的撤消操作



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

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

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

是我错过了什么,还是这是WebView的限制?

一个私有API解决方案是调用-[WebView _clearUndoRedoOperations]。

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

从你的描述来看,它没有这样做。我怀疑您找到目标以便明确地删除它的目的将是徒劳的,因此我想建议另一种解决方案,我以前使用过,或者我在这条路上走得足够远,可以考虑使用;)

我对这种情况的想法是使用NSUndoManager的自定义子类,它能够保持自己的所有注册的冗余内存(通过重写registerUndoWithTarget:…和prepareWithInvocationTarget)。有了所有注册的可信赖数组,您就可以在任何时候实施您自己的清洁房屋策略。例如,你可能会说"如果目标的类来自一个框架,我不拥有,就删除它"…或者更具体地说,你想删除任何与类WebEditorUndoTarget匹配的东西,例如。

上次我检查NSUndoManager有一个方法- (void)removeAllActions。不需要指定动作目标

相关内容

  • 没有找到相关文章

最新更新