2011-11-29 82 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。無需指定行動目標。