Тонкая настройка автоматического завершения NSTextField

Я использую NSControlTextEditingDelegate для автоматического завершения того, что введено в NSSearchField, с помощью генерируемых мной пользовательских предложений. complete: сообщение отправляется в редактор полей при изменении текста.

Теперь я хотел бы точно настроить поведение автозаполнения и заставить его работать точно так же, как текстовое поле поиска Google работает в Safari:

  1. Когда два или более слова (разделенные пробелами) вводятся в NSTextField, расположение для NSRange, переданное в control:textView:textView:completions:forPartialWordRange: indexOfSelectedItem:, начинается после последнего введенного пробела.

    Это означает, что если пользователь вводит «Сан-Франциско», а API Google возвращает «Сан-Франциско», при выборе его из списка автозаполнения значение NSTextField заменяется на «Сан-Сан-Франциско».

    Возможный обходной путь состоит в перестроении NSArray, содержащем завершение и возвращающем только суффикс фактических предложений, в зависимости от charRange.location. Это выглядит паршиво (поскольку список автодополнения теперь показывает только часть строки завершения), поэтому я хочу, чтобы NSTextField игнорировались пробелы при запросе автозавершения.

  2. При выборе автодополнения из списка действие NSSearchField по умолчанию не отправляется. На данный момент пользователю нужно выбрать автозаполнение, а затем нажать клавишу ввода, чтобы запустить поиск.


person Yoav    schedule 30.11.2014    source источник
comment
Столкнулся с той же проблемой.   -  person Scott Ahten    schedule 25.11.2018


Ответы (1)


Вы можете сделать это с помощью редактора настраиваемых полей, а не полностью полагаться на обратные вызовы делегатов.

1) Переопределите rangeForUserCompletion и скорректируйте возвращаемое значение, чтобы оно включало текст после пробела.

2) Переопределите insertCompletion:forPartialWordRange:movement:isFinal и, если установлен флажок isFinal, выполните обработку принятия.

Шаг (1) выше зафиксирует диапазон. Если вы также устанавливаете индекс в completionsForPartialWordRange для заполнения редактирования (или оставляете его равным 0 по умолчанию), пробел вместе с «/» и «.» примет текущую выбранную строку, даже если пользователь хотел просто продолжать печатать. Чтобы обойти это, в insertCompletion:forPartialWordRange:movement:isFinal, если isFinal имеет значение true, проверьте [NSApp currentEvent] на наличие этих символов и, если они будут найдены, пропустите их без обработки или вызова super.

person Zoë Peterson    schedule 18.07.2019
comment
Редактор пользовательского поля можно заменить редактором по умолчанию, вернув подкласс NSTextView в windowWillReturnFieldEditor из NSWindowDelegate. - person Kaunteya; 20.10.2020