2017-06-12 89 views
0

我尝试将Firebase数据库中的数据显示到我的tableView中。代码使用“选项卡视图控制器”,但为了项目的目的,我不得不在一个经典的ViewController中包含一个TableView。iOS:在tableView中显示firebase数据

这里是应该从数据库中获取数据的代码,并将其包含在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。如果我没有覆盖,我不应该在代码中的某处调用这些函数,以使它们工作?谢谢。

回答

2

完成块observe将调用异步并在此之前执行您的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() 
     } 
    }) 

} 

注:也再次确认您的tableView的delegatedatasource连接。

+0

我已经试过这个解决方案(这是我写的原始版本)。这仍然不能解决问题,不幸的是。 –

+0

@VictorMihaita你调试你的代码是,如果块正在执行,如果你还没有调试的代码,但试图调试它,并检查控制进去,如果阻止或不。 –

+0

我刚刚做到了。数组从数据库中获取正确的数据,我可以打印它的每个元素。我正在重新加载tableView之前正在打印它。所以问题只在于显示数据。 –