为什么无法将Firebase Realtime数据库中的数据显示到UITableView中?

时间:2019-05-13 22:25:03

标签: swift firebase firebase-realtime-database

我正在尝试从Firebase实时数据库中检索我的数据,但是该数据没有出现在我的UITableView中。我正在检索数据,并尝试将其附加到我创建的名为Party的数据模型类型的数组中。我不确定如何设置我的代码,以便可以成功地将数据从Firebase获取到我的UITableView,也不确定问题出在哪里。

我尝试整理我的代码,并使用其他方法从Firebase检索数据,但没有任何效果。我创建了一个名为party的数组,用于存储Party类型的信息。

以下是我的UITableViewController重写功能的代码。这是我的Firebase数据库的大部分代码所在的地方。这是带有自定义单元格的表格视图。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Set the Firebase reference.
        ref = Database.database().reference()

        // Retrieve the parties and listen for changes.
        ref?.child("parties").observeSingleEvent(of: .value, with: { (snapshot) in
            // Take the value from the snapshot and add it to the parties array.
            let value = snapshot.value as? NSDictionary
            let titleText = value?["titleText"] as? String ?? "Title"
            let dateText = value?["dateText"] as? String ?? "Date"
            let timeText = value?["timeText"] as? String ?? "Time"

            self.parties.append(Party(title: titleText, date: dateText, time: timeText))
        })

        tableView.reloadData()

        guard let cell = tableView.dequeueReusableCell(withIdentifier: "YourPartiesTableViewCell", for: indexPath) as? YourPartiesTableViewCell else {
            fatalError("The dequeued cell is not an instance of YourPartiesTableViewController")
        }

        let party = parties[indexPath.row]

        // Configure the cell
        cell.titleLabel.text = party.titleText
        cell.dateAndTimeLabel.text = "\(party.dateText) at \(party.timeText)"
        cell.inviationsLabel.text = "0 people"
        cell.view.layer.cornerRadius = 15

        return cell
    }

我希望它可以将Firebase中的数据附加到多方数组。然后,我希望该数据显示在表格视图中。为什么没有发生?我的代码在哪里错了?

1 个答案:

答案 0 :(得分:2)

您不应该在cellForRowAt内加载任何数据,因为dataSource数组中的每个实例都会调用该数据,并删除reloadData也不会导致递归调用

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return parties.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {  
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "YourPartiesTableViewCell", for: indexPath) as? YourPartiesTableViewCell else {
            fatalError("The dequeued cell is not an instance of YourPartiesTableViewController")
        }

        let party = parties[indexPath.row]

        // Configure the cell
        cell.titleLabel.text = party.titleText
        cell.dateAndTimeLabel.text = "\(party.dateText) at \(party.timeText)"
        cell.inviationsLabel.text = "0 people"
        cell.view.layer.cornerRadius = 15

        return cell
    }
func loadData() {

    // Set the Firebase reference.
    ref = Database.database().reference() 
    // Retrieve the parties and listen for changes.
    ref?.child("parties").observeSingleEvent(of: .value, with: { (snapshot) in
        // Take the value from the snapshot and add it to the parties array.
        let value = snapshot.value as? NSDictionary
        let titleText = value?["titleText"] as? String ?? "Title"
        let dateText = value?["dateText"] as? String ?? "Date"
        let timeText = value?["timeText"] as? String ?? "Time" 
        self.parties.append(Party(title: titleText, date: dateText, time: timeText)) 
        self.tableView.reloadData()
    }) 

 }

loadData呼叫viewDidLoad