SwiftUI如何在不使用List的情况下从@ObservedObject ViewModel获取Firebase数据



我正在学习SwiftUI,并尝试在使用Firebase从数据库中检索数据后检索信息。

我检索了一次数据以摘要方式显示,然后使用链接导航,我试图检索其余信息以获得更准确的显示,但我出现了错误。我想在不使用列表的情况下检索准确的数据。

PrintSpecificData.swift

//
//  complete_deliv_view.swift
//  db_test
//
//  Created by admin on 21/03/2021.
//
import SwiftUI
struct complete_deliv_view: View {
@ObservedObject private var viewModel = delivViewModel()
var body: some View {
Text(self.viewModel.av_deliveries.from) // ERROR IS HERE
.onAppear() {
self.viewModel.fetchDelivResume()
}
}
}
struct complete_deliv_view_Previews: PreviewProvider {
static var previews: some View {
complete_deliv_view()
}
}

打印摘要数据

//
//  ContentView.swift
//  db_test
//
//  Created by admin on 21/03/2021.
//
import SwiftUI
struct delivResum:Identifiable {
// SUMMARY INFORMATIONS
var id: String = UUID().uuidString
var when: String
var from: Int
var to: Int
var whath: Int
// FULL INFORMATIONS
var name: String
var adress: String
var to_adress: String
var tel: Int
}
struct ContentView: View {
@ObservedObject private var viewModel = delivViewModel()
var body: some View {
NavigationView {
NavigationLink(destination:complete_deliv_view()) {
List(viewModel.av_deliveries) { deliv in
HStack {
Text ("🚨")
Text(deliv.when)
Text ("🏠")
Text(String(deliv.from))
Text ("➡")
Text(String(deliv.to))
Text ("⏰")
Text("(deliv.whath)h")
}
}
.navigationBarTitle("Livraisons")
.onAppear() {
self.viewModel.fetchDelivResume()
}
}
}

}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

从Firebase.swift 获取数据

//
//  delivViewModel.swift
//  db_test
//
//  Created by admin on 21/03/2021.
//
import Foundation
import FirebaseFirestore
class delivViewModel : ObservableObject {
@Published var av_deliveries = [delivResum]()

private var db = Firestore.firestore()

func fetchDelivResume() {
db.collection("av_deliveries").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("Pas de livraison disponible 😩")
return
}
self.av_deliveries = documents.map { (QueryDocumentSnapshot) -> delivResum in
let data = QueryDocumentSnapshot.data()
let when = data["when"] as? String ?? ""
let from = data["from"] as? Int ?? 0
let to = data["to"] as? Int ?? 0
let whath = data["whath"] as? Int ?? 0
let name = data["name"] as? String ?? ""
let adress = data["adress"] as? String ?? ""
let to_adress = data["to_adress"] as? String ?? ""
let tel = data["tel"] as? Int ?? 0

return delivResum(when: when, from: from, to: to, whath: whath, name: name, adress: adress, to_adress: to_adress, tel: tel)
}
}
}
}

这可能是一个愚蠢的问题,但我真的不明白如何只获取电话号码,例如在PrintSpecificData.swift 中

感谢您对的宝贵帮助

您可以只传递一个delivResnum实例作为参数,而不是在局部视图上重新创建视图模型。您必须稍微更改ContentView的结构,使其每行都有不同的NavigationLink,而不是包装整个列表。


struct ContentView: View {
@ObservedObject private var viewModel = delivViewModel()
var body: some View {
NavigationView {
List(viewModel.av_deliveries) { deliv in
NavigationLink(destination:complete_deliv_view(deliv: deliv)) {
HStack {
Text ("🚨")
Text(deliv.when)
Text ("🏠")
Text(String(deliv.from))
Text ("➡")
Text(String(deliv.to))
Text ("⏰")
Text("(deliv.whath)h")
}
}
}
.navigationBarTitle("Livraisons")
.onAppear() {
self.viewModel.fetchDelivResume()
}
}
}
}
struct complete_deliv_view: View {
var deliv : delivResum
var body: some View {
Text(deliv.from)
}
}

注意:在Swift中,将类型名称大写是常见的做法。如果要遵循此约定,则需要重命名为DelivResumDelivViewModel

最新更新