Firebase tableview没有填充,Swift

时间:2019-03-01 11:16:00

标签: swift firebase firebase-realtime-database

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

这是我的代码:

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()
}

这是我的数据库结构: enter image description here

我明显地在做错什么吗?还是有人可以看到导致没有数据加载的原因?

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

提前谢谢!

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

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

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

这是我用于函数的代码,其中使用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的问题-我的错。