J'essaye d'utiliser Picker comme sélection de struct. Disons que j'ai une structure "Pet" comme ci-dessous
Picker("Pet", selection: $petSelection) { ForEach(0 ..< Self.pet.count) { index in Text(Self.pet[index].name).tag(index) }
Je reçois tous les animaux d'une classe, où les animaux sont définis comme @Published var pets = Pet
Picker("Pet", selection: $petSelection){ ForEach(Self.pets) { item in Text(item.name) } }
Je voudrais pouvoir écrire une sélection du sélecteur à la variable ci-dessous:
@State private var petSelection: Pet?
Le sélecteur est:
static let pets = Class().pets
Le sélecteur montre correctement tous les familiers disponibles, mais lorsque j'ai choisi un animal, la sélection n'a pas été modifiée (néant). Comment dois-je le gérer?
Merci!
Éditer:
Bien sûr, je sais que je peux utiliser des balises comme ci-dessous:
struct Pet: Identifiable, Codable, Hashable { let id = UUID() let name: String let age: Int }
Mais je me demande s'il est possible d'utiliser struct comme sélection. Merci
3 Réponses :
Vous utilisez la manière suivante:
@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) }}}
le type de $petSelection
dans Picker(selection:[...]
doit être le même type d' id
dans votre structure. Donc, dans votre cas, vous devrez changer $petSelection
pour taper si UUID
puisque vos éléments dans la collection ont UUID comme identifiant.
Quoi qu'il en soit puisque ce n'est pas ce que vous recherchez, mais votre intention est de recevoir l' Pet
dans son ensemble lorsqu'il est sélectionné. Pour cela, vous aurez besoin d'un wrapper contenant Pet
comme id
. Comme l' Pet
est déjà Identifiable
, il n'y a que quelques ajustements à faire:
Créer un wrapper ayant Pet
comme id
Picker("Pet", selection: $petSelection) { ForEach(Self.pets.map(PetPickerItem.init), id: \.pet) { Text("\($0.pet?.name ?? "None")") } }
Emballez maintenant tous les éléments de la collection dans l'élément de sélection
struct PetPickerItem { let pet: Pet? }
Vous pouvez maintenant faire des ajustements mineurs comme rendre PetPickerItem
identifiable pour supprimer le paramètre id:
de ForEach
.
C'est la meilleure solution que j'ai trouvée.
Voici comment je fais:
struct Language: Identifiable, Hashable { var title: String var id: String } struct PickerView: View { var languages: [Language] = [Language(title: "English", id: "en-US"), Language(title: "German", id: "de-DE"), Language(title: "Korean", id: "ko-KR")] @State private var selectedLanguage = Language(title: "German", id: "de-DE") var body: some View { Picker(selection: $selectedLanguage, label: Text("Front Description")) { ForEach(self.languages, id: \.self) {language in Text(language.title) } } }