4

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

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

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

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

4

3 回答 3

1

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

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

对于这种情况,我的想法是使用 NSUndoManager 的自定义子类,它能够在其上保留所有注册的冗余内存(通过覆盖 registerUndoWithTarget:... 和 prepareWithInvocationTarget)。有了所有注册的可信赖数组,您就可以随时实施自己的清洁政策。例如,您可能会说“如果目标的类来自我不拥有的框架,则将其删除”……或者更具体地说,您想删除与 WebEditorUndoTarget 类匹配的任何内容。

于 2011-11-30T00:25:21.797 回答
1

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

于 2011-11-30T00:37:28.350 回答
0

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

于 2013-04-12T15:08:54.073 回答