为什么我的Firestore数据没有显示为表格视图?

时间:2020-11-01 07:34:20

标签: swift xcode google-cloud-firestore firebase-authentication swiftui

我目前正在使用Xcode(用户界面:情节提要)和Google Firebase进行项目。我无法让我的应用显示以下信息: Desired output

我得到这张图片的方式是通过启动一个测试项目,选择SwiftUI作为我的用户界面,并且只有一个单视图控制器。在我的应用中,用户只有登录后并单击将其带到表格视图的按钮,才能访问此页面。

我的应用当前将结果显示在Xcode的底部: Current output

import UIKit
import FirebaseFirestore

class AssetViewController: UIViewController {

    @IBOutlet weak var assetList: UITableView!
        override func viewDidLoad() {
            super.viewDidLoad()

    // Do any additional setup after loading the view.
    let db = Firestore.firestore()
                                
    db.collection("assets").getDocuments { (snapshot, error) in
        if error != nil {
            print("error")
        } else {
    for document in (snapshot?.documents)! {
        if let brand = document.data() ["brand"] as? String {
        if let description = document.data() ["description"] as? String {
        if let date = document.data() ["date"] as? String {
        if let cost = document.data() ["cost"] as? String {
        if let serial = document.data() ["serial"] as? String {
        if let warranty = document.data() ["warranty"] as? String {
        if let warranty_cost = document.data() ["warranty_cost"] as? String {
                                            
        print("\(document.documentID) => \(document.data())") }
        }
            }
                }
            }
        }
            }
                }
            }
        }
            }
}

我有以下课程:

import Foundation
import FirebaseFirestore

class AssetsViewModel: ObservableObject {
    @Published var assets = [Asset] ()
    
    private var db = Firestore.firestore()
    
    func fetchData() {
        db.collection("assets").addSnapshotListener { (QuerySnapshot, error) in
            guard let documents = QuerySnapshot?.documents else {
                print("No assets in here")
                return
            }
            self.assets = documents.map { (QueryDocumentSnapshot) -> Asset in
                let data = QueryDocumentSnapshot.data()
                
                let brand = data["brand"] as? String ?? ""
                let description = data["description"] as? String ?? ""
                let date = data["date"] as? String ?? ""
                let cost = data["cost"] as? String ?? ""
                let serial = data["serial"] as? String ?? ""
                let warranty = data["warranty"] as? String ?? ""
                let warranty_cost = data["warranty_cost"] as? String ?? ""
                
                return Asset(brand: brand, description: description, date: date, cost: cost, serial: serial, warranty: warranty, warranty_cost: warranty_cost)
            }
            
        }
    }
    
}

我有以下结构:

import Foundation

struct Asset: Identifiable {
    var id: String = UUID().uuidString
    var brand: String
    var description: String
    var date: String
    var cost: String
    var serial: String
    var warranty: String
    var warranty_cost: String
}

我的主要目标是像显示第一张图片一样显示信息。我将不胜感激。

这是我用来显示第一张图片的代码:

import SwiftUI

struct ContentView: View {
    
    @ObservedObject private var viewModel = AssetsViewModel()
    
    var body: some View {
        NavigationView {
            List(viewModel.assets) { asset in
                VStack(alignment: .leading) {
                    Text(asset.brand)
                        .font(.headline)
                    Text(asset.description)
                        .font(.subheadline)
                    Text(asset.date)
                        .font(.subheadline)
                    Text(asset.cost)
                    .font(.subheadline)
                    Text(asset.serial)
                    .font(.subheadline)
                    Text(asset.warranty)
                    .font(.subheadline)
                    Text(asset.warranty_cost)
                    .font(.subheadline)
                }
            }
        .navigationBarTitle("Assets")
            .onAppear() {
            self.viewModel.fetchData()
            }
        }
    }

}

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

下面的帖子帮助了我。我得到的错误是因为Swift不喜欢我将ViewTable命名为“ assetList”。一旦我将名称更改为“ tableView”并在代码中进行了更改,它就会很好地工作。我添加了额外的代码来使单元格从此处自动调整:why UITableViewAutomaticDimension not working?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要这样的东西:

import Foundation
import UIKit
import FirebaseFirestore

class myTableCell: UITableViewCell {
    @IBOutlet weak var brand: UILabel!
    @IBOutlet weak var description: UILabel!
    @IBOutlet weak var date: UILabel!
    @IBOutlet weak var cost: UILabel!
    @IBOutlet weak var serial: UILabel!
    @IBOutlet weak var warranty: UILabel!
    @IBOutlet weak var warrantyCost: UILabel!
}

class IndexAssets {
    var brand = ""
    var description = ""
    var date = ""
    var cost = ""
    var serial = ""
    var warranty = ""
    var warrantyCost = ""
    
    init(brand: String, description: String, date: String, cost: String, serial: String, warranty: String, warrantyCost: String)
    {
        self.brand = brand
        self.description = description
        self.date = date
        self.cost = cost
        self.serial = serial
        self.warranty = warranty
        self.warrantyCost = warrantyCost
    }
}

class AssetViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var assetList: UITableView!
    
    var dataArray: [IndexAssets] = [IndexAssets]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        downloadData()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! myTableCells
        
        cell.brand?.text = dataArray[indexPath.row].brand
        cell.description?.text = dataArray[indexPath.row].description
        cell.date?.text = dataArray[indexPath.row].date
        cell.cost?.text = dataArray[indexPath.row].cost
        cell.serial?.text = dataArray[indexPath.row].serial
        cell.warranty?.text = dataArray[indexPath.row].warranty
        cell.warrantyCost?.text = dataArray[indexPath.row].warrantyCost
        
        return cell
        
    }
    
    func downloadData()
    {

        let db = Firestore.firestore()
                                
        db.collection("assets").getDocuments { (snapshot, error) in
        if error != nil
        {
            print("error")
        }
        else
        {
            for document in (snapshot?.documents)!
            {
                let brand = document.data() ["brand"] as? String
                let description = document.data() ["description"] as? String
                let date = document.data() ["date"] as? String
                let cost = document.data() ["cost"] as? String
                let serial = document.data() ["serial"] as? String
                let warranty = document.data() ["warranty"] as? String
                let warrantyCost = document.data() ["warranty_cost"] as? String
                
                if let brand = brand, let description = description, let date = date, let cost = cost, let serial = serial, let warranty = warranty, let warrantyCost = warrantyCost
                {
                    let insert = IndexAssets(brand: brand, description: description, date: date, cost: cost, serial: serial, warranty: warranty, warrantyCost: warrantyCost)
                    self.dataArray.append(insert)
                }
            }
            self.assetList.reloadData()
        }}
    }

            
}

此外,请记住在情节提要中:

  • 将“单元格”分配给您的动态单元格标识符
  • 选择myTableCell作为该单元格的类
  • 从类中拖动标签以将其连接到情节提要
  • 将表拖到View Controller(顶部的黄色图标)上,然后选择“数据源和代理”。