SwiftUI 和 Picker 和 FireStore 返回文档 ID 不下降

Posted

技术标签:

【中文标题】SwiftUI 和 Picker 和 FireStore 返回文档 ID 不下降【英文标题】:SwiftUI and Picker and FireStore return doc ID not fall 【发布时间】:2021-02-27 17:34:23 【问题描述】:

我有两个 DisclosureGroup,每个都有一个选择器。第一个选择器只是从一个静态的年份数组中读取,并且可以正常工作。第二个选择器填充用户名的选择器,但当您选择用户时,该值是 Firebase 文档 ID,而不是全名值。

// 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) 

但是,如果您遇到过两个司机同名的情况,这会产生有趣的结果。

也许更好的选择是从选定的 ID 导出模型:

onChange

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

【讨论】:

我知道它不受欢迎,但感谢您的建议。

以上是关于SwiftUI 和 Picker 和 FireStore 返回文档 ID 不下降的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:使用 Picker(分段)更改 ForEach 源或获取请求

SwiftUI Picker,将 String 转换为 Double

SwiftUI 中的选择器选择和翻译冲突

SwiftUI 从另一个视图中捕获 Picker 值

SwiftUI Picker 多个错误,核心数据,布局

过滤 Firebase 数据 SwiftUI