Если вы посмотрите комментарии, то увидите, что некоторые говорят, что это не работает. Я вырезал и вставил код в файл, и все заработало. Я считаю, что проблема этих людей заключалась в том, что текст автозаполнения был установлен на белый цвет. (Как вы можете видеть на верхнем GIF-изображении.) Очевидно, что в белом текстовом поле они не будут видны. Я изменил цвет автозаполнения на зеленый, чтобы исправить эту проблему.

Примечание: обновлено до Swift 4. Теперь с Gists вместо блоков кода Medium.

Проблема: автозаполнение встроенного текста

Я был удивлен тем, насколько легко было найти ресурсы для создания текстового поля с автозаполнением с помощью tableView ниже для отображения результатов. Сначала я думал, что сопоставление пользовательской строки с массивом результатов будет сложной задачей, но я не мог ошибиться. С помощью Stack Overflow я все заработал за считанные минуты. Оказалось, что проблема заключалась в возврате результатов в текстовое поле. Надеюсь, это поможет вам реализовать свои собственные решения, не решая все мелкие проблемы, с которыми мне приходилось сталкиваться.

Разбиваем проблему на то, что мы пытаемся сделать

  • Нам нужно получить запрос пользователей
  • Проверьте, соответствует ли их запрос чему-либо в нашем массиве строк
  • Если это так, мы хотим, чтобы остальная часть строки отображалась после запроса пользователя другим цветом.

Что нужно учитывать

  • Нам нужно держать курсор в правильном для пользователя положении.
  • Нам также нужна бесшовная поддержка пользователей, которые ошибаются в написании слова или используют Backspace.
  • Нам нужно уметь определять, что в текстовом поле является пользовательским текстом, а что является нашим текстом для автозаполнения.
  • Нам нужно иметь дело с пользователями, использующими странные заглавные буквы
  • Что, если пользователь очищает текстовое поле

Шаг 1. Настройте наш ViewController

Примечание. Вам нужно управлять перетаскиванием из текстового поля в маленький желтый кружок в верхней части раскадровки и выбрать «делегировать».

Шаг 2. Отправьте текст из текстового поля в нашу функцию SearchAutocompleteEntries

  1. Мы сделали наш VC совместимым с UITextFieldDelegate, поэтому начните вводить «shouldChange», и он автоматически завершит нашу функцию.
  2. Внутри этой функции мы берем текст и форматируем его.
  3. Эта проверка предназначена для того, чтобы увидеть, очищает ли пользователь текстовое поле.
  4. Отправьте пользовательский запрос функции, которую мы собираемся создать
  5. Я отформатировал его так, чтобы он был в нижнем регистре, а затем в верхнем регистре из-за того, как отформатирован мой массив autocompletePossabilities. Нам нужен .lowercased, если у них есть фиксированные заглавные буквы. Важной частью этой строки является функция .dropLast. Нам нужно сделать это, чтобы убрать предыдущий текст автозаполнения.

Шаг 3. Найдите наши возможности автозаполнения и добавьте предложение автозаполнения в текстовое поле

  1. "Предложения" - это массив возможных совпадений с автозаполнением.
  2. Нам нужно использовать таймеры, чтобы заменить текст в textField без странного поведения. Это не идеально, есть небольшая задержка, но работает почти идеально.
  3. Это принимает первый результат в «предложениях» и обрезает символы, введенные пользователем.
  4. Это объединяет пользовательский запрос и наше отформатированное предложение, раскрашивает текст предложения и помещает его в текстовое поле.
  5. Перемещает курсор после запроса пользователя и до предложения автозаполнения

Шаг 4 Функции, необходимые для работы шага 3

Примечание. Если вы делаете это на белом фоне, белый текст автозаполнения явно не будет отображаться. Измените цвет фона или цвет текста автозаполнения.

В общем, я объяснил, что эти функции делают на шаге 3. Если вы не уверены, просто спросите меня. Я надеюсь, что они говорят сами за себя.

Заключение

Надеюсь, это поможет вам, если вам понравится этот пост, и подпишитесь на меня. Я собираюсь и дальше публиковать решения проблем, с которыми я сталкиваюсь при разработке собственного приложения.

Учебник от aestusLabs. Поделитесь своими знаниями.