Удаление действий отмены для NSUndoManager WebView

У меня есть несколько WebView, которые я переключаю между своей иерархией представлений. Некоторые из этих веб-представлений содержат поля формы, поэтому я реализую editDelegate, чтобы предоставить NSUndoManager для моего документа.

Проблема в том, что любой ввод текста в WebView генерирует действия, которые помещаются в стек отмены. После удаления представления из иерархии действия остаются в стеке отмены. В этот момент, если пользователь использует Cmd-Z для «Отменить ввод», возникает исключение, потому что -undoEditing: отправляется освобожденному экземпляру WebEditorUndoTarget. (Частный класс, используемый в реализации WebKit.)

Я не могу использовать -removeAllActionsWithTarget: потому что не могу сослаться на цель. Похоже, единственное решение — отключить отмену регистрации для WebView.

Я что-то упустил или это ограничение WebView?


person chockenberry    schedule 29.11.2011    source источник


Ответы (3)


Одним из частных решений API является вызов -[WebView _clearUndoRedoOperations]. Пока не нашел общедоступного API-решения.

person Jonathan Hammer    schedule 30.11.2011
comment
Похоже, что отправка WebView сообщения -close приводит к вызову _clearUndoRedoOperations. Я видел -_close предшествующий _clearUndoRedoOperations в трассировке исключения, и похоже, что публичный метод делает то же самое. - person chockenberry; 30.11.2011

По моему мнению, WebView должен взять на себя ответственность за удаление себя или любых подчиненных объектов из undoManager WebView: в данном случае вашего.

Судя по вашему описанию, он этого не делает. Я подозреваю, что ваша цель найти цель, чтобы вы могли удалить ее явно, будет бесплодной, поэтому я хотел бы предложить другое решение, которое я либо использовал раньше, либо я достаточно далеко продвинулся по этому пути, чтобы подумать об использовании ; )

Идея, которая у меня была для такого рода ситуаций, состоит в том, чтобы использовать собственный подкласс NSUndoManager, который способен хранить свою собственную избыточную память обо всех регистрациях (путем переопределения registerUndoWithTarget:… и prepareWithInvocationTarget). Имея надежный набор всех регистраций, вы можете в любое время навязать свою собственную политику уборки дома. т.е. вы можете сказать: «Если целевой класс относится к фреймворку, которым я не владею, просто удалите его»… или, если быть более конкретным, сказать, что вы хотите удалить все, что соответствует классу WebEditorUndoTarget, например.

person danielpunkass    schedule 30.11.2011

В прошлый раз, когда я проверял, у NSUndoManager был метод - (void)removeAllActions. Нет необходимости указывать цели действий.

person Jacque    schedule 12.04.2013