alp*_*nec 5 swiftui swiftui-picker
根据 Apple 的关于使用 Enum 的 SwiftUI 中的 Picker的文档,如果 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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我tag为每个视图传递一个,它就可以工作。
这里发生了什么事?苹果文档有错吗?该selectedFlavor变量需要一个 type 值Flavor,但选择器中使用的 id 实际上是 a String。
谢谢。
为了使 aPicker正常工作,需要确定其元素。
请注意,该selectedFlavor变量的类型为Flavor。这意味着 Picker 中的选项应该被标识为 Flavors(而不是 Strings)。
但是,在您的代码中,您id的类型为String:
var id: String { self.rawValue }
Run Code Online (Sandbox Code Playgroud)
您可以:
tag(类型Flavor):Text(flavor.rawValue.capitalized)
.tag(flavor)
Run Code Online (Sandbox Code Playgroud)
Flavor以Identifiable提供自定义id类型Flavor:var id: Flavor { self }
Run Code Online (Sandbox Code Playgroud)
id参数(类型Flavor)ForEach:ForEach(Flavor.allCases, id: \.self) { ... }
Run Code Online (Sandbox Code Playgroud)
selectedFlavor为字符串:@State private var selectedFlavor = Flavor.chocolate.rawValue
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
685 次 |
| 最近记录: |