【问题标题】:SwiftUI how get Firebase data from @ObservedObject ViewModel without using ListSwiftUI 如何在不使用 List 的情况下从 @ObservedObject ViewModel 获取 Firebase 数据
【发布时间】:2021-03-21 16:02:13
【问题描述】:

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

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

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()
    }
}

FetchDataFromFirebase.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 中

感谢您的宝贵帮助

【问题讨论】:

    标签: ios swift database firebase swiftui


    【解决方案1】:

    您可以只传递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

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2020-04-13
      相关资源
      最近更新 更多