6

根据 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)")
        }
    }
}

在此处输入图像描述

tag但是,如果我为每个视图传递一个,它就可以工作。

在此处输入图像描述

这里发生了什么事?苹果文档有错吗?该selectedFlavor变量需要一个 type 的值Flavor,但选择器中使用的 id 实际上是 a String

谢谢。

4

2 回答 2

12

要使 aPicker正常工作,需要确定其元素。

请注意,selectedFlavor变量的类型为Flavor。这意味着 Picker 中的选项应该被标识为 Flavors(而不是 Strings)。

但是,在您的代码中,您id的类型是String

var id: String { self.rawValue }

您可以:

  • 提供一个tag(类型Flavor):
Text(flavor.rawValue.capitalized)
    .tag(flavor)
  • 通过提供类型的自定义Flavor来符合:IdentifiableidFlavor
var id: Flavor { self }
  • 在 中明确指定id参数(类型FlavorForEach
ForEach(Flavor.allCases, id: \.self) { ... }
  • 将 更改selectedFlavor为字符串:
@State private var selectedFlavor = Flavor.chocolate.rawValue
于 2020-10-09T10:02:24.187 回答
4

这是对@pawello2222 已经很棒的答案的补充。

只是为了澄清使用以下代码使枚举符合 Identifiable 的解决方案可以正确标记 UI 选择器,而无需在选择器代码中明确声明它:

var id: Flavor { self }

swiftUI 选择器的官方Apple 文档说使用 id 枚举使用var id: String { self.rawValue }并且使用示例代码的其余部分无法按预期工作。

于 2020-12-10T23:11:55.933 回答