Если вы посмотрите комментарии, то увидите, что некоторые говорят, что это не работает. Я вырезал и вставил код в файл, и все заработало. Я считаю, что проблема этих людей заключалась в том, что текст автозаполнения был установлен на белый цвет. (Как вы можете видеть на верхнем GIF-изображении.) Очевидно, что в белом текстовом поле они не будут видны. Я изменил цвет автозаполнения на зеленый, чтобы исправить эту проблему.
Примечание: обновлено до Swift 4. Теперь с Gists вместо блоков кода Medium.
Проблема: автозаполнение встроенного текста
Я был удивлен тем, насколько легко было найти ресурсы для создания текстового поля с автозаполнением с помощью tableView ниже для отображения результатов. Сначала я думал, что сопоставление пользовательской строки с массивом результатов будет сложной задачей, но я не мог ошибиться. С помощью Stack Overflow я все заработал за считанные минуты. Оказалось, что проблема заключалась в возврате результатов в текстовое поле. Надеюсь, это поможет вам реализовать свои собственные решения, не решая все мелкие проблемы, с которыми мне приходилось сталкиваться.
Разбиваем проблему на то, что мы пытаемся сделать
- Нам нужно получить запрос пользователей
- Проверьте, соответствует ли их запрос чему-либо в нашем массиве строк
- Если это так, мы хотим, чтобы остальная часть строки отображалась после запроса пользователя другим цветом.
Что нужно учитывать
- Нам нужно держать курсор в правильном для пользователя положении.
- Нам также нужна бесшовная поддержка пользователей, которые ошибаются в написании слова или используют Backspace.
- Нам нужно уметь определять, что в текстовом поле является пользовательским текстом, а что является нашим текстом для автозаполнения.
- Нам нужно иметь дело с пользователями, использующими странные заглавные буквы
- Что, если пользователь очищает текстовое поле
Шаг 1. Настройте наш ViewController
Примечание. Вам нужно управлять перетаскиванием из текстового поля в маленький желтый кружок в верхней части раскадровки и выбрать «делегировать».
Шаг 2. Отправьте текст из текстового поля в нашу функцию SearchAutocompleteEntries
- Мы сделали наш VC совместимым с UITextFieldDelegate, поэтому начните вводить «shouldChange», и он автоматически завершит нашу функцию.
- Внутри этой функции мы берем текст и форматируем его.
- Эта проверка предназначена для того, чтобы увидеть, очищает ли пользователь текстовое поле.
- Отправьте пользовательский запрос функции, которую мы собираемся создать
- Я отформатировал его так, чтобы он был в нижнем регистре, а затем в верхнем регистре из-за того, как отформатирован мой массив autocompletePossabilities. Нам нужен .lowercased, если у них есть фиксированные заглавные буквы. Важной частью этой строки является функция .dropLast. Нам нужно сделать это, чтобы убрать предыдущий текст автозаполнения.
Шаг 3. Найдите наши возможности автозаполнения и добавьте предложение автозаполнения в текстовое поле
- "Предложения" - это массив возможных совпадений с автозаполнением.
- Нам нужно использовать таймеры, чтобы заменить текст в textField без странного поведения. Это не идеально, есть небольшая задержка, но работает почти идеально.
- Это принимает первый результат в «предложениях» и обрезает символы, введенные пользователем.
- Это объединяет пользовательский запрос и наше отформатированное предложение, раскрашивает текст предложения и помещает его в текстовое поле.
- Перемещает курсор после запроса пользователя и до предложения автозаполнения
Шаг 4 Функции, необходимые для работы шага 3
Примечание. Если вы делаете это на белом фоне, белый текст автозаполнения явно не будет отображаться. Измените цвет фона или цвет текста автозаполнения.
В общем, я объяснил, что эти функции делают на шаге 3. Если вы не уверены, просто спросите меня. Я надеюсь, что они говорят сами за себя.
Заключение
Надеюсь, это поможет вам, если вам понравится этот пост, и подпишитесь на меня. Я собираюсь и дальше публиковать решения проблем, с которыми я сталкиваюсь при разработке собственного приложения.