Я разрабатываю приложение Cocoa для упаковки разработанного мной веб-приложения JavaScript, которое обеспечивает редактирование графики SVG. У меня есть следующий вопрос, который мотивирован желанием настроить операции "Вырезать", "Копировать" и "Вставить" и связанные с ними пункты меню.
Как я могу:
- замените моего собственного ответчика вместо WKWebView или
- настроить его ответы на
validateMenuItem:
иcut:
copy:
andpaste:
selectors?
Меня особенно интересуют решения, которые сохраняют полезную функциональность WKWebView для предоставления вырезания, копирования и вставки для текстовых полей.
Любая помощь приветствуется. Далее следует деталь.
Цель моей обертки cocoa состоит из трех частей:
- обеспечить постоянство
- для обеспечения интеграции буфера обмена
- обеспечить печать
Я достиг 1, но заблокирован на 2 и 3; этот вопрос составляет около 2.
В частности, я не могу заставить фреймворк вызывать любую реализацию validateMenuItem:
что я предоставляю - в результате я не могу контролировать, когда пункты меню "Вырезать", "Копировать" или "Вставить" доступны для выбора пользователем.
Я пробовал следующее:
- отметьте мой подкласс NSViewController как принимающий первого ответчика и переопределите
validateMenyItem:
там - моя реализация никогда не вызывалась - подкласс WKWebView и переопределить
validateMenuItem:
- моя реализация никогда не вызывалась - подкласс NSWindowController и переопределить
validateMenuItem:
- моя реализация никогда не вызывалась
Теперь у моего завернутого веб-приложения есть текстовые поля. Когда я даю один из этих фокусов и когда это уместно (текст находится в буфере обмена, я выделяю текст), опции "Вырезать", "Копировать" и "Вставить" в моем меню "Редактировать" автоматически активируются. Они даже работают. (Мне нравится эта функциональность и я хотел бы ее сохранить.) Поэтому я подозреваю, что происходит то, что WKWebView, как мой текущий первый ответчик, перехватывает любой вызов validateMenuItem:
по цепочке ответчиков. Но мне также нужно иметь возможность активировать пункты меню в соответствии с другими состояниями в моем завершенном веб-приложении - например, когда пользователь выбирает SVG-графику.
Обновить
Я сделал дополнительный копать, пытаясь найти решение моей проблемы. В моем подклассе WKWebView я добавил пользовательский @IBAction
. Я создал пункт меню для этого на моей доске объявлений и подключил пункт меню к FirstResponder, выбрав мое новое действие.
И мой validateMenuItem:
на моем подклассе WKWebView был вызван. Но только для этого нового селектора, а не для copy:
селектор, связанный с @IBAction
который я ранее добавил в мой подкласс WKWebView.
Теперь мой метод copy:
отмеченный с помощью @IBAction и имеющий подпись метода для вещей, которые Interface Builder (или что-то, что он назвал в наши дни), может использовать, не помечен как override
. Когда я попытался пометить его override
, я получил сообщение об ошибке. По-видимому, WKWebView не предоставляет метод copy:id
даже если он предоставляет функции копирования и правильно обрабатывает пункт меню, когда выбран текст в текстовом поле.
Таким образом, похоже, что WKWebView каким-то образом автоматически (и всегда) обрабатывает проверку определенных селекторов, обычно привязанных к меню - в частности, cut:
copy:
и paste:
Более того, подклассификация WKWebView и переопределение validateMenuItem:
недостаточно для прерывания/принятия контроля над этим поведением по умолчанию. Что кажется странным.
Но, читая другие сообщения в WKWebView на StackOverflow, я знаю, что WKWebView на самом деле представляет собой довольно сложную функциональность. Меня особенно интересует, что WKWebView фактически запускает веб-контент в отдельном процессе. Поэтому я задаюсь вопросом, отвечает ли что-то, связанное с этим отдельным процессом, на проверку меню и обработку cut:
copy:
и paste:
- что-то внутреннее для рамки и к которому у меня нет доступа.
Я все еще надеюсь на решение. Надеемся, что приведенное выше обновление окажется полезным.