2011-11-29 57 views
4

我有几个WebViews可以进出我的视图层次结构。其中一些WebViews包含表单域,所以我实现了editDelegate为我的文档提供NSUndoManager。删除WebView的NSUndoManager的撤销操作

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

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

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

回答

1

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

+0

它看起来像发送WebView一个close信息导致_clearUndoRedoOperations被调用。我在异常回溯中看到了-_close前面的_clearUndoRedoOperations,它看起来像公共方法做同样的事情。 – chockenberry

+0

很高兴知道。谢谢! –

1

在我看来,WebView应该承担从WebView的撤消管理器中删除自身或任何从属对象的责任:在这种情况下,你的。

从您的描述来看,它并没有这样做。我怀疑你的目标是找到目标,这样你可以明确地将其删除,所以我想提出另一个解决方案,我以前使用过这个解决方案,或者我在这条路上有足够的空间来考虑使用; )

我对这种情况的想法是使用NSUndoManager的自定义子类,它能够保留自己的所有注册的冗余内存(通过覆盖registerUndoWithTarget:...和prepareWithInvocationTarget)。随着所有注册信息的可靠排列,您可以随时施加自己的清理房屋政策。即您可能会说“如果目标的类来自我不拥有的框架,请将其删除”或者更具体一些,例如,您想删除与WebEditorUndoTarget类相匹配的任何内容。

0

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