Picker в SwiftUI: выбирай и назначай

Всем привет! Вы на канале школы мобильной разработки SwiftBook. Здесь мы рассказываем и показываем всё, что знаем о языке Swift и Kotlin: увлечённо, понятно и без воды.

С вами Анна Васичко и в этом уроке мы поговорим про элемент, доступный в SwiftUI, который называется Picker - он используется для осуществления выбора среди набора значений.

Ссылка на видео здесь.

Picker в SwiftUI: выбирай и назначай

Picker создаётся на основе параметров selection, куда передаётся bindibg свойство, title и content.

Давайте рассмотрим возможности этого элемента на следующем примере.

Для начала мы объявим перечисление, в котором будут храниться значения, которые мы будем отображать далее при помощи Picker.

Это будет перечисление с неким набором товаров, назовём его GoodsCategory с типом исходных значений String, а также подпишем перечисление под протоколы Caseiterable для доступа к свойству allCases, а также Identifiable, чтобы обеспечить возможности уникальной идентификации для значений.

enum GoodsCategory: String, CaseIterable, Identifiable {

case clothes

case shoes

case food

case electronics

Внутри перечисления укажем также вычисляемые свойства id и также свойство title, возвращающее строковую репрезентацию для элементов перечисления:

var id: Self {

self

}

var title: String {

switch self {

case .clothes:

return "Clothes"

case .shoes:

return "Shoes"

case .food:

return "Food"

case .electronics:

return "Electronics"

}

}

}

Теперь перейдём непосредственно к самому Picker, обратимся к этому элементу с параметрами title, selection и content

В selection нам необходимо передать binding свойство, для этого выше объявим State private свойство с типом нашего перечисления и со значением в виде одного из кейсов.

Выбор при помощи пикера будет осуществляться среди кейсов перечисления.

Теперь передадим это свойство со знаком $ в параметр selection нашего пикера.

В контенте пикера отобразим при помощи текста кейсы перечисления: в сам текст мы передаём строку, обращаясь к свойству title, а также мы должны добавить тэги, этого требует Picker, в тэгах мы обращаемся к соответствующему кейсу перечисления.

Picker в SwiftUI: выбирай и назначай

Но, понятное дело, что вот так прописывать текст для каждого кейса не имеет смысла, не зря мы подписывали перечисление под протоколы CaseIterable и Identifiable, мы воспользуемся инструментом ForEach:

ForEach(GoodsCategory.allCases) { category in

Text(category.title).tag(category)

}

И справа мы уже видим отобразившийся Picker.

По дефолту он имеет стиль меню.

Давайте поменяем цвет Picker на, например, красный

И также обернём его в Vstack и ниже добавим Hstack, в котором будем отображать значение, выбранное через Picker.

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

.tint(.red)

HStack {

Text("You search in:")

Text(selectedCategory.rawValue)

}

Также мы можем поместить Picker внутрь List, в нашем случае я просто заменю VStack на List, и здесь уже цвет не отображается, поэтому модификатор tint мы можем удалить.

Зато в этом варианте нам становится доступен к отображению параметр title у Пикера, мы видим его слева.

Кроме того, мы можем изменить стиль Picker. Для этого используется модификатор

.pickerStyle

.pickerStyle(.segmented)

У этого варианта мы можем например изменить цвет фона

.background(Color.gray)

Также есть стили wheel и inline.

Кроме того при стандартном отображении в виде меню помимо текста можно также добавить и иконку, вот таким образом:

category in

HStack {

Text(category.title).tag(category)

Spacer()

Image(systemName: "magnifyingglass.circle")

}

Picker в SwiftUI: выбирай и назначай

Можно сделать разные картинки для разных категорий при помощи switch, у меня есть для этого сниппет, правда я не нашла подходящей иконки для обуви, оставила поэтому картинку с лупой.

Вот таким образом можно работать с элементом Picker в SwiftUI, он достаточно интересный и несложный в использовании.

Подписывайся на наши соцсети: Telegram / VKontakte
Вступай в открытый чат для iOS-разработчиков: t.me/swiftbook_chat

11
1 комментарий

SwiftUI — ну совсем не продакшен реди
Каждый сложный лейаут упирается в долгую компиляцию; разбиение на компоненты решает только часть проблем — алерты и прочие модификаторы вынести некуда

И да, в итоге процесс разработки превращается в танцы с бубном над компилятором, который «не смог»

И я не преувеличиваю, компилятор так и говорит — я не смог, попробуй попроще описать…

После разработки на Texture с DSL расширением (https://github.com/nickaroot/TextureUI) разработка на SwiftUI становится просто какой-то шуткой

Ответить