如何在Picker中跟踪选定对象- SwiftUI

pieyvz9o  于 2023-06-04  发布在  Swift
关注(0)|答案(1)|浏览(562)

下面的代码有效地显示了狗的名字,当选择一只狗时,它输出了它的颜色。我想做的是能够跟踪选择了什么对象,并能够在onChange方法中访问它的所有属性。
如何在onChange方法中访问所选对象的所有属性?

class Dog:NSObject {
        var name = ""
        var color = ""
        var breed = ""
        
        init(name: String, color: String, breed: String) {
            self.name = name
            self.color = color
            self.breed = breed
        }
    }

    class DogService:ObservableObject{
        @Published var dogs:[Dog]
        
        init(){
            dogs = [Dog(name:"Pluto", color: "Brown", breed: "Golden Retriever"),
                    Dog(name: "Teddy", color: "White", breed: "Poodle"),
                    Dog(name: "Rocky", color: "Black", breed: "Labrador")]
        }
    }

    struct PickerTest: View {
        let dogService = DogService()
        @State private var selectedDog = ""
        
        var body: some View {
            Form {
                Picker("Dogs:", selection: $selectedDog) {
                    ForEach(dogService.dogs, id: \.self) {
                        Text($0.name).tag($0.color)
                    }
                }
                .onChange(of: selectedDog) {dog in
                    print("Dog Color: \(dog)") // outputs, Brown, White or Black

                    // what I would like to do...  
                    // print("Dog Breed: \(dog.breed)") // should output, Golden Retriever, Poodle or Labrador
                }
            }
        }
    }
ruarlubt

ruarlubt1#

您可以使用Dog来代替String

struct PickerTest: View {
    let dogService = DogService()
    @State private var selectedDog: Dog? = nil //Types must match
    
    var body: some View {
        Form {
            Picker("Dogs:", selection: $selectedDog) {
                ForEach(dogService.dogs, id: \.self) {
                    Text($0.name).tag($0 as Dog?) //Types must match
                }
            }
            .onChange(of: selectedDog) {dog in
                print("Dog Color: \(dog)")
            }
        }
    }
}

另外需要考虑的是,为了让SwiftUI知道一个对象的变量何时发生了变化,class必须是一个ObservableObject,带有适当的@Published变量,或者是一个struct。您的class Dog:NSObject,应根据您的要求进行更改。

相关问题