Воспользуйтесь мощью 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.

Вот и все. Спасибо за прочтение.