swiftUI中的选择器正在从Firestore中选择文档ID而不是文档字段
因此,我试图在swiftui中的表单中使用选择器中的firebase集合,但当我选择所需的运动时,该运动的文档ID将保存到我的变量中 所以这是我的观点,我有选择者swiftUI中的选择器正在从Firestore中选择文档ID而不是文档字段,swift,firebase,google-cloud-firestore,swiftui,uipickerview,Swift,Firebase,Google Cloud Firestore,Swiftui,Uipickerview,因此,我试图在swiftui中的表单中使用选择器中的firebase集合,但当我选择所需的运动时,该运动的文档ID将保存到我的变量中 所以这是我的观点,我有选择者 struct ContentView: View { @ObservedObject var sportsObserved = sportsObserver() @State private var sport = "" var body: some View {
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
}
}
}
}
}
}
}
将修复程序发布为社区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)
}
}
.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)
}
}