Как отключить функциональность LookUp (Словарь, Тезаурус, Википедия) в NSTextView?
Один из моих проектов - это тестовое приложение, в котором ученик не должен легко искать слова во время их ввода.
Относительно легко отключить автоматическую проверку орфографии в NSTextView с помощью setContinuousSpellCheckingEnabled:
и setAutomaticSpellingCorrectionEnabled:
.
Я только что обнаружил, что для студентов очень тривиально просто коснуться тремя пальцами по любому выбранному слову в любом приложении и всплывает полезное окно содержащий словарь, тезаурус и даже запись в Википедии, если там можно найти слово.
![What Lookup functionality looks like]()
Это отличная функциональность для 99% приложений MacOS, но не подходит для моего тестового приложения.
Теперь, спустя несколько месяцев, Apple предоставила мне (недокументированное и тонкое) решение, которое работает только для 10.8, и я могу в конечном итоге предоставить его в ответах ниже, но мне нужно, чтобы иметь решение, которое работает и для 10.7 (именно там и появилась эта функциональность).
Есть три возможных плана атаки на эту проблему, но я не уверен, как подойти к любому из этих трех:
1)
Мне нужно заблокировать эту функцию Lookup в этом текстовом представлении.
2)
Я уже пытался удалить настройки словаря (если они существуют, если пользователь никогда не открывал Dictionary.app, нет никаких предпочтений) и файлы кеша словаря (в "~/Library/Cache
", но это не похоже, улучшают ситуацию.
3)
Или есть ли способ обнаружить параметр трекпада, который говорит "Использовать поиск при выполнении трех пальцевого крана"? Это возможно в некотором com.apple. *. Plist где-то или обнаруживается через "defaults
", но я не уверен, где.
EDIT:
Осталось только немного времени, чтобы, надеюсь, решить эту проблему и наградить щедростью. Вот такой подход, который я пытался с помощью defaults
":
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerTapGesture -bool false
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDoubleTapGesture -bool false
Но я не на 100% уверен, что это правильные жесты/ключевые слова для ввода. И даже после их ввода (и проверки они были правильно сохранены с помощью "defaults read com.apple.driver.AppleBluetoothMultitouch.trackpad
" ), окно LookUp словаря все еще появляется.
Теперь это единственное, что работает, но оно работает только под MacOS 10.8 (где эти методы были выставлены/привезены). Просто переопределите эти два метода в подклассе NSTextView:
- (void)quickLookWithEvent:(NSEvent *)event;
- (void)quickLookPreviewItems:(id)sender;
Ответы
Ответ 1
Я подозреваю, что поиск словаря реализован одним из двух способов: службой или протоколом NSTextInputClient
. Поэтому я бы переопределил -validRequestorForSendType:returnType:
в вашем подклассе текста, чтобы узнать, вызван ли он для трех пальцевого крана. В любом случае, это похоже на приложение, которое вы хотите вернуть NO
для всех служб. Вы также должны переопределить writeSelectionToPasteboard:types:
, чтобы вернуть NO
.
Если это не так, попробуйте переопределить методы NSTextInputClient
, чтобы узнать, вызваны ли они. В частности, методы -attributedString
и -attributedSubstringForProposedRange:actualRange:
- это то, как поиск словаря получает текст. Создание обоих возвратов nil
должно помешать работе. Имейте в виду, что протокол NSTextInputClient
имеет центральное значение для использования методов ввода и доступа к символам с акцентами и диакритикой нажатием и удержанием, поэтому вы можете это сломать. Я не знаю, сможете ли вы отличить запросы от обычного метода ввода и от жестов поиска словаря.
Если все остальное не удается, вы можете реализовать пользовательский текстовый вид вместо использования NSTextView
. Это не тривиально, но вы будете иметь полный контроль над его поведением.
Ответ 2
Этот ответ на аналогичный вопрос устраняет проблему, не исключая исключения из компромиссов с использованием частного API: fooobar.com/questions/374953/...
Просто переопределите -(void)quickLookWithEvent:(NSEvent *)event
в вашем подклассе и ничего не делайте с этим событием.
Ответ 3
Когда откроется окно "Словарь", перейдите в "Файл" (или, возможно, это было редактирование)/ "Установки", и снимите флажок со всех параметров, чтобы не проверять фактические параметры словаря и закрыть приложение, и оно больше не отображается - для большая часть - время от времени, пытаясь использовать коврик для мыши, чтобы выбрать строку текста для копирования и/или резки, она появляется, но не постоянно, как раньше...