繁体   English   中英

swiftUI 中的选择器正在从 Firestore 中选择文档 ID 而不是文档字段

[英]Picker in swiftUI is selecting document ID instead of document field from Firestore

所以我想要做的是在 swiftui 的表单中使用选择器中的 firebase 集合,但是当我选择我想要的运动时,该运动的文档 ID 将保存到我的变量中。

所以这是我的观点,我有选择器。

struct ContentView: View {
    @ObservedObject var sportsObserved = sportsObserver()
    
    @State private var sport = ""

    var body: some View {
        VStack{
            Form {                
                Picker(selection: $sport, label: Text("Sport")) {
                    ForEach(self.sportsObserved.sports) { i in
                        Text(i.sportName)
                    }
                }
                Text("You selected \(sport)")
            }
        }

    }
}

这些是我的 Firestore 文档的字段。

struct datatype3: Identifiable{
    
    var id : String
    var sportName: String
    var eventCount: Int
}

这是我的数据库可观察对象,它不是必需的,但我将它包含在内,以防有人需要它来完全重现我遇到的错误。

class sportsObserver: ObservableObject{
    @Published var sports = [datatype3]()
    init() {
        let db = Firestore.firestore()
        db.collection("sports").addSnapshotListener{ (snap, err) in
            
            if err != nil {
                print((err?.localizedDescription)!)
                return
            }
            for i in snap!.documentChanges{
                
                if i.type == .added {
                    
                    let id = i.document.documentID
                    let sportName = i.document.get("sportName") as! String
                    let eventCount = i.document.get("eventCount") as! Int
                    
                    
                    self.sports.append(datatype3(id: id, sportName: sportName, eventCount: eventCount))
                }
                
                if i.type == .removed {
                  
                     let id = i.document.documentID
                    
                    for j in 0..<self.sports.count{
                        
                        if self.sports[j].id == id{
                            self.sports.remove(at: j)
                            return
                        }
                    }
                }
                
                if i.type == .modified {
                    let id = i.document.documentID
                    let sportName = i.document.get("sportName") as! String
                    let eventCount = i.document.get("eventCount") as! Int


                    for j in 0..<self.sports.count{

                        if self.sports[j].id == id{
                            self.sports[j].sportName = sportName
                            self.sports[j].eventCount = eventCount

                            return
                        }
                    }
                }
            }
        }
    }
}

一旦我选择了“篮球”,结果如下: 在此处输入图片说明

正如您所看到的,我的数据库中 Basketball 的文档 ID 设置为 12Basketball,这不能简单地更改为“Basketball”,因为我在构建数据库时必须考虑其他因素。

我想要的是变量“sport”来存储“Basketball”,它是sportName,而不是“12Basketball”,它是documentID。

这是我想出的一个修复方法,如果有人可以向我展示更好的方法,我仍然会很高兴,因为这种方法非常笨拙。

.onAppear {
            for i in sportsObserved.sports {
                if sportID == i.id {
                    sport = i.sportName
                }
            }
Picker(selection: $sportID, label: Text("Sport")) {
                    ForEach(self.sportsObserved.sports) { i in
                        Text(i.sportName).tag(i.id)
                    }
                }

将修复发布为社区 Wiki 以获得可见性:

.onAppear {
            for i in sportsObserved.sports {
                if sportID == i.id {
                    sport = i.sportName
                }
            }
Picker(selection: $sportID, label: Text("Sport")) {
                    ForEach(self.sportsObserved.sports) { i in
                        Text(i.sportName).tag(i.id)
                    }
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM