Удаление действий отмены для NSUndoManager WebView - PullRequest
4 голосов
/ 30 ноября 2011

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

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

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

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

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

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

1 голос
/ 30 ноября 2011

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

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

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

0 голосов
/ 12 апреля 2013

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

...