【问题标题】:Firebase tableview not populating, SwiftFirebase tableview没有填充,Swift
【发布时间】:2019-03-01 11:15:59
【问题描述】:

我的数据库中有数据,可以搜索单个记录,这很好。但是,当我尝试使用所有数据库记录简单地填充表视图时,它不会接收/显示任何数据。

这是我的代码:

struct drinkStruct {
    let pub: String!
    let rating: String!
    let price: String!
}

override func viewDidLoad() {
    super.viewDidLoad()
    loadDrinks()
    }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func homeClicked(_ sender: Any) {
    homeClicked()
}


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


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return posts.count
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

    let label1 = cell.viewWithTag(1) as! UILabel
    label1.text = posts[indexPath.row].pub

    let label2 = cell.viewWithTag(2) as! UILabel
    label2.text = posts[indexPath.row].rating

    let label3 = cell.viewWithTag(3) as! UILabel
    label3.text = posts[indexPath.row].price


    return cell
}


func loadDrinks(){

    let databaseRef = Database.database().reference().child("Drinks")

    ref = Database.database().reference()
    databaseRef.queryOrderedByKey().observe(.childAdded, with: { (snapshot) in

        if let valueDictionary = snapshot.value as? [AnyHashable:String]
        {
            let pub = valueDictionary["pub"]
            let rating = valueDictionary["rating"]
            let price = valueDictionary["price"]
            self.posts.insert(drinkStruct(pub: pub, rating: rating, price: price), at: 0)


        }


    })
    self.tableview.reloadData()
}

这是我的数据库结构:

我是否在做明显错误的事情?或者任何人都可以看到是什么导致没有数据加载?

没有错误/未使用的变量等。

提前致谢!

【问题讨论】:

  • 回调是异步的,所以你在下载任何东西之前调用 tableView.reloadData()
  • @JoakimDanielson 感谢您的回复 - 那么我应该什么时候给它打电话?
  • 你需要一个数据模型。
  • 使用下面的快速枚举来获取每个数组元素的字典。在 snapshot.children.allObjects 作为饮料! [数据快照] { }
  • @JoakimDanielson 虽然这是对 那个 问题的一个很好的回答,但它与 Firebase 闭包无关,因为它们的行为不同。 Firebase 闭包中的 UI 调用在主线程上运行,因此不需要调度调用。参见this answer 以及@frankvanpuffelen 对this question 的评论。只需将self.tableview.reloadData() 移动到闭包内即可。

标签: swift firebase firebase-realtime-database


【解决方案1】:

我认为以下应该可以完成这项工作。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    override func viewDidLoad() {
        super.viewDidLoad()

        //getting a reference to the node //
        databaseRef = Database.database().reference().child("Drinks")

        //observing the data changes
        databaseRef.observe(DataEventType.value, with: { (snapshot) in
            if snapshot.childrenCount > 0 {
                // clearing the list //
                self.posts.removeAll()

                // iterating through all the values //
                for drinks in snapshot.children.allObjects as! [DataSnapshot] {
                    let drinkObject = drinks.value as! [String: AnyObject]
                    let drinkPub  = drinkObject["pub"]
                    let drinkRating  = drinkObject["rating"]
                    let drinkPrice = drinkObject["price"]

                    //creating a drinkStruct object with the model //
                    let drinkModel = drinkStruct(pub: drinkPub as! String?, rating: drinkRating as! String?, price: drinkPrice as! String?)

                    //appending it to list
                    self.posts.append(drinkModel)
                }
                // reloading data //
                self.tableView.reloadData()
            }
        })
    }

    var posts = [drinkStruct]()
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! YourCustomTableViewCell
        let drink: drinkStruct
        drink = posts[indexPath.row]
        cell.label1.text = drink.pub
        cell.label2.text = drink.rating
        cell.label3.text = drink.price
        return cell
    }
}

【讨论】:

  • 谢谢你 - 有一些问题,我在你的 func tableView 上遇到错误 - 说“使用未声明的类型'YourCustomTableViewCell'”然后“'UITableViewCell'类型的值没有成员'label1'" + label 2 & 3。谢谢你的帮助!
  • 你没有告诉你如何处理你的表格视图单元格。
  • 这对我来说是全新的——我以前从未使用过表格视图。我如何知道如何处理 tableview 单元格?
  • 这是一个可靠的答案。我可能会将let drinkPub = drinkObject["pub"] 更改为let drinkPub = drinkObject["pub"] as? String ?? "No pub" 以解开可选项并保护代码。 @EoghanCasey 询问如何使用 tableView 超出了问题的范围,您需要了解一些基础知识。互联网上有许多教程,但特别是查看 Ray Wenderlich 的指南,因为它们是一些更好的指南 TableView tutorial
【解决方案2】:

对于追随我的新手,我通过做很多事情解决了这个问题。

您需要在情节提要中创建表格视图和单元格布局。然后,您需要一个单元类来指示/分配每个单元中发生的事情(图像视图、标签等),以及一个模型类,用于您正在查找的任何内容,无论对象是什么。

这是我用于我的函数的代码,其中我使用来自 Firebase 的数据填充单元格中的信息:

 func loadDrinks(){
    Database.database().reference().child("Drinks").observe(.childAdded) { (snapshot: DataSnapshot) in
        if let dict = snapshot.value as? [String: Any] {
            let pub = dict["pub"] as! String
            let rating = dict["rating"] as! String
            let price = dict["price"] as! String

            let drink = Drink(pub: pub.capitalized, rating: rating.capitalized, price: price.capitalized)
            self.drinks.append(drink)
            print(self.drinks)
            self.tableview.reloadData()

        }
    }
}

这是一个新手 101 问题 - 我的错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多