将选择作为结构的 SwiftUI 选择器

Pa *_*loo 5 picker swift swiftui

我正在尝试使用 Picker 作为结构的选择。假设我有一个如下所示的结构“Pet”

struct Pet: Identifiable, Codable, Hashable {

    let id = UUID()
    let name: String
    let age: Int
}
Run Code Online (Sandbox Code Playgroud)

我从某个类中获取所有宠物,其中宠物被定义为 @Published var pets = Pet

static let pets = Class().pets
Run Code Online (Sandbox Code Playgroud)

我希望能够将选择器中的选择写入以下变量:

@State private var petSelection: Pet?
Run Code Online (Sandbox Code Playgroud)

选择器是:

Picker("Pet", selection: $petSelection){
                    ForEach(Self.pets) { item in
                        Text(item.name)

                    }
                }
Run Code Online (Sandbox Code Playgroud)

选择器正确显示了所有可用的宠物,但是当我选择一只宠物时,选择没有改变(零)。我应该如何管理它?

谢谢!

编辑:

当然我知道我可以使用如下标签:

Picker("Pet", selection: $petSelection) {
ForEach(0 ..< Self.pet.count) { index in
    Text(Self.pet[index].name).tag(index)
    }
Run Code Online (Sandbox Code Playgroud)

但奇怪是否可以使用 struct 作为选择。谢谢

pd9*_*d95 20

简短回答:与(the s)tag中的条目关联的类型必须与用于存储选择的类型相同。PickerText

在您的示例中:您有 的可选选择(可能允许“空选择”)Pet?,但传递给的数组ForEach的类型为[Pet]。因此,您必须.tag(item as Pet?)在条目中添加 a 以确保选择有效。

ForEach(Self.pets) { item in
    Text(item.name).tag(item as Pet?)
}
Run Code Online (Sandbox Code Playgroud)

以下是我最初的替代答案(摆脱可选性):

您已将您的选择定义为Optional您的结构:Pet?。看来选择器无法正确处理可选结构作为其选择类型。

一旦你摆脱了可选的,例如通过引入“虚拟/未选择的宠物”,Picker就再次开始工作:

ForEach(Self.pets) { item in
    Text(item.name).tag(item as Pet?)
}
Run Code Online (Sandbox Code Playgroud)

在您看来初始化选择:

@State private var petSelection: Pet = .emptySelection
Run Code Online (Sandbox Code Playgroud)

我希望这对你也有帮助。


E.C*_*oms 4

您使用以下方式:

 @Published var  pets: [Pet?] = [ nil, Pet(name: "123", age: 23), Pet(name: "123dd", age: 243),]

     VStack{
      Text(petSelection?.name ??  "name")
      Picker("Pet", selection: $petSelection){
         ForEach(Self.pets, id: \.self) { item in
            Text(item?.name ?? "name").tag(item)
       }}}
Run Code Online (Sandbox Code Playgroud)