Воспользуйтесь мощью SwiftUI и его совместимостью с UIKit
По мере того, как SwiftUI завершает год, есть много чего ожидать от WWDC 2020. Наличие готовой функциональности панели поиска должно быть в списке желаний каждого.
А пока мы можем использовать совместимость SwiftUI-UIKit для создания настраиваемой панели поиска.
В следующих разделах мы будем создавать приложение SwiftUI для поиска контактов.
План действий
- Используйте платформу контактов для получения телефонных контактов.
- Заполните их в списке SwiftUI.
- Используйте протокол
UIViewRepresentable
, чтобы создатьUISearchBar
оболочку для SwiftUI. - Отфильтруйте список контактов SwiftUI на основе найденного текста.
Приступайте к работе - добавьте описания конфиденциальности
Платформа "Контакты" позволяет читать информацию без каких-либо изменений. Чтобы получить доступ к этому в вашем приложении, нам сначала нужно установить описания использования конфиденциальности в файле info.plist
. Просто добавьте ключ NSContactsUsageDescription
со строковым значением, объясняющим необходимость разрешения.
Оберните UISearchBar с помощью UIViewRepresentable и координаторов
SwiftUI не имеет встроенных функций для панелей поиска. Итак, нам нужно согласовать нашу структуру с протоколом UIViewRepresentable
и инициализировать в ней экземпляр UISearchBar
UIKit, как показано ниже:
Функция makeCoordinator()
позволяет нам создать класс Coordinator
, который отвечает за передачу изменений из нашего представления UIKit в интерфейс SwiftUI. Давайте определим класс Coordinator
, который также объявляет протокол UISearchBarDelegate
:
Создайте класс ObservableObject для выборки контактов
ObservableObject
протокол является частью платформы Combine и используется для объявления изменений в представлении SwiftUI через @Published
оболочку свойств.
В следующем коде мы получаем контакты, убедившись, что разрешение предоставлено, а затем сохраняем их в массиве-оболочке свойств Published
:
SwiftUI нужен способ уникальной идентификации каждого контакта. Для этого мы создали в конце расширение, соответствующее протоколу Identifiable
.
Теперь мы готовы интегрировать оболочку панели поиска и экземпляр класса ObservableObject
в наш SwiftUI View. Давай сделаем это.
Создайте представление SwiftUI
Мы будем использовать @EnvironmentObject
для получения контактов. Оболочка свойств позволяет получать доступ к общим данным в приложении.
В следующем коде с помощью списка SwiftUI мы можем заполнить контакты и обновить их с помощью filter
на основе изменения searchText
значения.
Вот посмотрите на приложение в действии, когда мы запустили его на симуляторе с фиктивными контактами:
Заключение
Нам удалось довольно быстро настроить приложение контактов SwiftUI с функциями поиска - несмотря на отсутствие поддержки встроенной панели поиска в SwiftUI.
То же самое с UITableView
и UISearchBar
потребует значительного количества времени, усилий и кода. Мы надеемся увидеть SwiftUI 2.0 в WWDC 2020 с новыми функциями.
Вы можете скачать полный исходный код из Репозитория Github.
Вот и все. Спасибо за прочтение.