iOS:在tableView中显示firebase数据

时间:2017-06-12 12:16:06

标签: ios swift firebase firebase-realtime-database tableview

我尝试将Firebase数据库中的数据显示到我的tableView中。代码使用" Tabs View Controller",但为了项目的目的,我必须在经典的ViewController中包含TableView。

以下是应该从数据库获取数据的代码,并进一步将其包含在tableview中。

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class NewsfeedViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var ref:DatabaseReference!,
        posts = [eventStruct]()

    @IBOutlet weak var tableview: UITableView!

    struct eventStruct {
        let title: String!
        let date: String!
        let location: String!
    }

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

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

    func loadNews() {
        ref = Database.database().reference()
        ref.child("events").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in

            if let valueDictionary = snapshot.value as? [AnyHashable:String]
            {
                let title = valueDictionary["Title"]
                let location = valueDictionary["Location"]
                let date = valueDictionary["Date"]
                self.posts.insert(eventStruct(title: title, date: date, location: location), at: 0)
            }
        })
        self.tableview.reloadData()
    }

    //Table View Content
    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].title

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

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

        return cell
    }

}

我没有收到任何错误,但数据未显示在tableView中。

以前我必须为控制tableview的每个函数使用override。如果我没有覆盖,我不应该在代码中的某个地方调用这些函数以使它们工作?谢谢。

1 个答案:

答案 0 :(得分:3)

observe的完成块将调用async,您的self.tableview.reloadData()将在此之前执行,因此您需要在将对象插入数组后重新加载完成块内的tableView

func loadNews() {
    ref = Database.database().reference()
    ref.child("events").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in

        if let valueDictionary = snapshot.value as? [AnyHashable:String]
        {
            let title = valueDictionary["Title"]
            let location = valueDictionary["Location"]
            let date = valueDictionary["Date"]
            self.posts.insert(eventStruct(title: title, date: date, location: location), at: 0)
            //Reload your tableView
            self.tableview.reloadData()
        }
    })

}

注意:同时确认您的delegatedatasource tableView已连接。