由枚举驱动的 SwiftUI 选择器:值未更新
SwiftUI picker driven by an enum: value not updated
根据 Apple 关于 Picker in SwiftUI using an Enum 的文档,如果枚举除了 CaseIterable
之外还符合 Identifiable
协议,遍历所有情况的选取器应该在本机更新绑定变量。
我测试了它,它没有按预期工作。
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
,它就会起作用。
这里发生了什么?苹果文档有错吗? selectedFlavor
变量需要一个 Flavor
类型的值,但在选择器中使用的 id 实际上是 String
.
谢谢。
要使 Picker
正常工作,需要识别其元素。
注意 selectedFlavor
变量的类型是 Flavor
。这意味着选择器中的选项应该被标识为风味(而不是字符串)。
但是,在您的代码中,您的 id
类型为 String
:
var id: String { self.rawValue }
您可以:
- 提供
tag
(Flavor
类型):
Text(flavor.rawValue.capitalized)
.tag(flavor)
- 通过提供类型
Flavor
: 的自定义 id
使 Flavor
符合 Identifiable
var id: Flavor { self }
- 在
ForEach
: 中明确指定 id
参数(Flavor
类型)
ForEach(Flavor.allCases, id: \.self) { ... }
- 将
selectedFlavor
更改为字符串:
@State private var selectedFlavor = Flavor.chocolate.rawValue
这是对@pawello2222 已经很棒的答案的补充。
澄清一下,使用以下代码使枚举符合 Identifiable 的解决方案可以正确标记 UI 选择器,而无需在选择器代码中明确声明它:
var id: Flavor { self }
官方 Apple documentation for the swiftUI picker 说要使用 var id: String { self.rawValue }
来标识枚举,但使用示例代码的其余部分无法按预期工作。
根据 Apple 关于 Picker in SwiftUI using an Enum 的文档,如果枚举除了 CaseIterable
之外还符合 Identifiable
协议,遍历所有情况的选取器应该在本机更新绑定变量。
我测试了它,它没有按预期工作。
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
,它就会起作用。
这里发生了什么?苹果文档有错吗? selectedFlavor
变量需要一个 Flavor
类型的值,但在选择器中使用的 id 实际上是 String
.
谢谢。
要使 Picker
正常工作,需要识别其元素。
注意 selectedFlavor
变量的类型是 Flavor
。这意味着选择器中的选项应该被标识为风味(而不是字符串)。
但是,在您的代码中,您的 id
类型为 String
:
var id: String { self.rawValue }
您可以:
- 提供
tag
(Flavor
类型):
Text(flavor.rawValue.capitalized)
.tag(flavor)
- 通过提供类型
Flavor
: 的自定义
id
使 Flavor
符合 Identifiable
var id: Flavor { self }
- 在
ForEach
: 中明确指定
id
参数(Flavor
类型)
ForEach(Flavor.allCases, id: \.self) { ... }
- 将
selectedFlavor
更改为字符串:
@State private var selectedFlavor = Flavor.chocolate.rawValue
这是对@pawello2222 已经很棒的答案的补充。
澄清一下,使用以下代码使枚举符合 Identifiable 的解决方案可以正确标记 UI 选择器,而无需在选择器代码中明确声明它:
var id: Flavor { self }
官方 Apple documentation for the swiftUI picker 说要使用 var id: String { self.rawValue }
来标识枚举,但使用示例代码的其余部分无法按预期工作。