Средство выбора SwiftUI, управляемое перечислением: значение не обновлено
Согласно документации Apple относительно Picker в SwiftUI с использованием Enum, если перечисление соответствует
Identifiable
протокол в дополнение к
CaseIterable
, средство выбора, перебирающее все случаи, должно обновлять связанную переменную изначально.
Я протестировал его, и он не работает должным образом.
enum Flavor: String, CaseIterable, Identifiable {
case chocolate
case vanilla
case strawberry
var id: String { self.rawValue }
}
struct EnumView: View {
@State private var selectedFlavor = Flavor.chocolate
var body: some View {
VStack {
Picker("Flavor", selection: $selectedFlavor) {
ForEach(Flavor.allCases) { flavor in
Text(flavor.rawValue.capitalized)//.tag(flavor)
}
}
Text("Selected flavor: \(selectedFlavor.rawValue)")
}
}
}
Однако, если я прохожу
tag
для каждого вида это работает.
Что тут происходит? Документация Apple неверна? В
selectedFlavor
переменная ожидает значение типа
Flavor
, но идентификатор, используемый в сборщике, на самом деле
String
.
Благодарю.
2 ответа
Для
Picker
для правильной работы необходимо определить его элементы.
Обратите внимание, что
selectedFlavor
переменная имеет тип
Flavor
. Это означает, что параметры в средстве выбора должны быть обозначены как "Ароматизаторы" (а не "Строки").
Однако в вашем коде ваш
id
относится к типу
String
:
var id: String { self.rawValue }
Вы также можете:
- обеспечить
tag
(типаFlavor
):
Text(flavor.rawValue.capitalized)
.tag(flavor)
- соответствовать
Flavor
кIdentifiable
путем предоставления индивидуальногоid
типаFlavor
:
var id: Flavor { self }
- указать
id
параметр (типаFlavor
) явно вForEach
:
ForEach(Flavor.allCases, id: \.self) { ... }
- изменить
selectedFlavor
быть строкой:
@State private var selectedFlavor = Flavor.chocolate.rawValue
Это дополнение к уже классному ответу @pawello2222.
Просто чтобы уточнить, что решение для соответствия перечисления Идентифицируемому с использованием приведенного ниже кода работает для правильной маркировки средства выбора пользовательского интерфейса без явного объявления его в коде средства выбора:
var id: Flavor { self }
Официальная документация Apple для средства выбора swiftUI говорит, что для идентификации перечисления используется
var id: String { self.rawValue }
и не работает должным образом, используя остальную часть кода примера.