首页 > 解决方案 > TableView 和 Firebase 实现的问题 (Swift)

问题描述

我想将我的 TableView 连接到我从 Firestore 查询的内容。查询有效,但我无法让 TableView 显示内容。现在它只是一个空白的tableView。TableViewCell 文件也没有问题,因为它之前没有使用 firebase 实现(正确注册了 Cell)。我怀疑问题出在cellForRowAt了那里,并尝试在那里玩耍,但没有任何工作。

你能找到问题吗?

import UIKit
import Firebase

class popularViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    @IBOutlet var table: UITableView!

    var texttt = [TextPost]()

    override func viewDidLoad() {
        super.viewDidLoad()
        gettingPosts()
        table.register(textTableViewCell.nib(), forCellReuseIdentifier: textTableViewCell.identifier)

        table.delegate = self
        table.dataSource = self

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        gettingPosts()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let alle = models.count + texttt.count
        return alle
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: textTableViewCell.identifier, for: indexPath) as! textTableViewCell
        cell.configure(with: texttt[indexPath.row])
        return cell
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 300
    }


    func gettingPosts(){

        let db = Firestore.firestore()
        let postsRef = db.collection("posts")
        postsRef.addSnapshotListener { (querySnapshot, error) in
            guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
            }
            snapshot.documentChanges.forEach { diff in
                if (diff.type == .added){
                    let data = diff.document.data()
                    let Name = data["username"] as! String
                    let text = data["description"] as! String
                    let likes = data["likes"] as! Int
                    let typ = data["postType"] as! Int
                    let pfp = data["profileImage"] as! String
                    let uid = data["uid"] as! String
                    let pic = data["picture"]
                    let time = data["time"] as! String

                    if typ == 0{                                                // Text post
                        let dasDing = TextPost(numberOfComments: 0, username: Name, timestampName: time, userImageName: pfp, textName: text)
                        self.texttt.append(dasDing)
                    }
                }
            }
        }
    }

}
struct TextPost {
    let numberOfComments: Int
    let username: String
    let timestampName: String
    let userImageName: String
    let textName: String
}

标签: swiftfirebaseuitableview

解决方案


从 firebase 获取数据后,您需要重新加载数据

func gettingPosts(){

    let db = Firestore.firestore()
    let postsRef = db.collection("posts")
    postsRef.addSnapshotListener { (querySnapshot, error) in
        guard let snapshot = querySnapshot else {
        print("Error fetching snapshots: \(error!)")
        return
        }
        snapshot.documentChanges.forEach { diff in
            if (diff.type == .added){
                let data = diff.document.data()
                let Name = data["username"] as! String
                let text = data["description"] as! String
                let likes = data["likes"] as! Int
                let typ = data["postType"] as! Int
                let pfp = data["profileImage"] as! String
                let uid = data["uid"] as! String
                let pic = data["picture"]
                let time = data["time"] as! String

                if typ == 0{                                                // Text post
                    let dasDing = TextPost(numberOfComments: 0, username: Name, timestampName: time, userImageName: pfp, textName: text)
                    self.texttt.append(dasDing)
                }
            }
        }

        DispatchQueue.main.async {
            tableView.reloadData()
        }
    }
}

推荐阅读