SwiftUI и средство выбора и FireStore возвращают идентификатор документа, который не падает

#google-cloud-firestore #swiftui #swiftui-picker

#google-облако-firestore #swiftui #swiftui-средство выбора

Вопрос:

У меня есть две группы раскрытия с сборщиком в каждой. Первый сборщик просто считывает данные из статического массива лет и работает без проблем. Второй сборщик, который заполняет сборщик именами пользователей, но когда вы выбираете пользователя, значением является идентификатор документа Firebase, а не значение fullname.

 // MARK: - DISCLOSER GROUP TRIP YEAR
   DisclosureGroup("Trip Year: (String(selectedYear))", isExpanded: $tripYearIsExpanded) {
      Picker(selection: $selectedYear, label: Text("")) {
         ForEach(years, id: .self) {
            Text(String($0))
         } // END:FOREACH
      } // END:PICKER
     .onChange(of: selectedYear, perform: { value in
        getTrips(passedYear: selectedYear)
      })
    } // END:DISCLOSUREGROUP
     .padding(.horizontal)
                
    // MARK: - DISCLOSURE GROUP DRIVER
    DisclosureGroup("Driver: (selectedDriver)", isExpanded: $driverIsExpanded) {
      Picker(selection: $selectedDriver, label: Text("")) {
         ForEach(userListVM.userVM, id: .id) { user in
            Text(user.fullname)
         } // END:FOREACH
      } // END:PICKER
        .onChange(of: selectedDriver, perform: { value in
           print("SELECTED DRIVER: (selectedDriver)")
        })
      }
      .padding(.horizontal)
 

Ответ №1:

Если бы вы действительно хотели selectedDriver быть именем, вы могли бы изменить свое ForEach на «основываться на fullname «, а не id :

 ForEach(userListVM.userVM, id: .fullname) {
 

Однако, если у вас когда-либо был случай, когда у двух драйверов было одно и то же имя, это привело бы к забавным результатам.

Возможно, лучшим вариантом было бы получение модели обратно из выбранного идентификатора:

в onChange :

 print("SELECTED DRIVER ID: (selectedDriver)")
let selectedDriverModel = userListVM.userVM.first { $0.id == selectedDriver }
print("Selected driver name: (selectedDriverModel?.fullname ?? "")")
 

Комментарии:

1. Я знаю, что это не одобряется, но спасибо за предложение.