В разработке приложений для iOS часто возникает задача организации удобного ввода данных — будь то имя, контакты, адреса, номера документов, банковские карты или реквизиты. В проектах с большим количеством таких полей важно обеспечить удобное переключение между ними. Для решения этой задачи в SwiftUI, начиная с iOS 15, используется property wrapper @FocusState, который значительно упрощает управление фокусом на элементах ввода и улучшает взаимодействие пользователя с интерфейсом.
Ниже представлен пример создания UI-компонента с использованием @FocusState и модификатора .toolbar для переключения фокуса между текстовыми полями. Этот подход позволяет переиспользовать код в различных частях приложения, что снижает дублирование, особенно на проектах с множеством форм и анкет.
Первым шагом создается контейнер, внутри которого размещаются поля ввода. В этом контейнере настраивается тулбар с кнопками "Назад" и "Далее" для управления фокусом.
Для связи между контейнером и дочерними view создаются специальные ключи:
С помощью FocusedFieldPreferences в контейнере будет получаться список всех дочерних UUID, а через FocusFieldEnvironment будет устанавливаться текущее активное поле.
Добавляются состояния для текущего индекса и списка идентификаторов дочерних view, а также для текущего сфокусированного поля:
Наша система сама подберет вам исполнителей на услуги, связанные с разработкой сайта или приложения, поисковой оптимизацией, контекстной рекламой, маркетингом, SMM и PR.
Заполнить заявку
13201 тендер
проведено за восемь лет работы нашего сайта.
Определены функции переключения фокуса на предыдущее и следующее поле с циклическим обходом:
Для управления фокусом у отдельных полей создаётся ViewModifier, который использует @FocusState и связывается с текущим активным UUID через окружение.
Применение модификатора focusable() позволяет подключить поддержку управления фокусом к любому View, например, к TextField:
Реализация такого подхода позволяет быстро и удобно переключаться между полями ввода в формах приложений под iOS, повышая удобство взаимодействия пользователя с интерфейсом.