【问题标题】:Why is my Firestore data not displaying as table view?为什么我的 Firestore 数据不显示为表格视图?
【发布时间】:2021-02-14 04:05:41
【问题描述】:

我目前正在使用 Xcode(用户界面:Storyboard)和 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?

非常感谢您的帮助!

【问题讨论】:

  • 你的表函数在哪里?

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


【解决方案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 作为该单元格的类
  • 从类中拖动标签以将它们连接到情节提要
  • 将表拖到视图控制器(顶部的黄色图标)并选择 DataSource 和 Delegate。

【讨论】:

  • 谢谢。如果我没有使用默认视图控制器,我无法让示例工作,所以我使用了这个 (stackoverflow.com/questions/33234180/…) 我明白你的意思是我没有任何表函数。该示例显示了一个静态数组。尝试显示 Firestore 中的信息时,我的班级会有所帮助吗?我该怎么做?
  • 看看我的例子
  • 您好,我按照您的所有步骤进行操作(非常感谢)。现在,我在尝试查看表格时收到以下错误:线程 1:异常:“[ setValue:forUndefinedKey:]:此类与键 tableView 的键值编码不兼容。”这显示在我的 AppDelegate 文件中。任何想法我做错了什么?此外,当链接“描述”标签时,它会给出 3 个错误:不能用“弱”属性覆盖“强”属性 属性“描述”类型为“UILabel?”无法覆盖类型为“字符串”的属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多