Удаление действий отмены для NSUndoManager WebView
У меня есть несколько WebView, которые я меняю в иерархии своих представлений. Некоторые из этих WebViews содержат поля формы, поэтому я реализую editDelegate, чтобы предоставить NSUndoManager для моего документа.
Проблема в том, что любая типизация, выполняемая в WebView, генерирует действия, которые помещаются в стек отмены. После удаления представления из иерархии действия все еще находятся в стеке отмены. В этот момент, если пользователь использует Cmd-Z для "Отменить ввод", возникает исключение, поскольку -undoEditing: отправляется освобожденному экземпляру WebEditorUndoTarget. (Закрытый класс, используемый в реализации WebKit.)
Я не могу использовать -removeAllActionsWithTarget: потому что я не могу ссылаться на цель. Похоже, что единственным решением является отключение регистрации отмены для WebView.
Я что-то упустил или это ограничение WebView?
3 ответа
Одно из частных решений API - вызвать -[WebView _clearUndoRedoOperations]. Еще не нашли общедоступного решения API.
По моему мнению, WebView должен взять на себя ответственность за удаление себя или любых подчиненных объектов из undoManager WebView: в этом случае, ваш.
Судя по твоему описанию, он этим не занимается. Я подозреваю, что ваша цель найти цель, чтобы вы могли удалить ее явным образом, будет бесполезной, поэтому я хотел бы предложить другое решение, которое я либо использовал ранее, или я продвинулся достаточно далеко, чтобы подумать об использовании;)
Мысль, которая у меня возникла для такой ситуации, состоит в том, чтобы использовать пользовательский подкласс NSUndoManager, который способен хранить собственную избыточную память всех регистраций на нем (переопределяя registerUndoWithTarget:… и prepareWithInvocationTarget). Имея надежный массив всех регистраций, вы можете в любое время навязать собственную политику уборки дома. Т.е. вы можете сказать "если класс цели взят из среды, которой я не владею, просто удалите ее" … или, если быть более точным, сказать, что вы хотите удалить что-нибудь, например, класс WebEditorUndoTarget.
В прошлый раз я проверял NSUndoManager
был метод - (void)removeAllActions
, Нет необходимости указывать цели действий.