2017-06-12 9 views
0

FirebaseデータベースからtableViewにデータを表示しようとしています。このコードは "Tabs View Controller"を使って機能しましたが、プロジェクトの目的のために、従来のViewControllerにTableViewを含める必要がありました。iOS:firebaseデータを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に表示されません。

以前は、テーブルビューを制御する関数ごとにオーバーライドを使用する必要がありました。オーバーライドしていない場合、それらの関数をコードのどこかで呼び出して、それらを機能させるべきではありません。ありがとうございました。

答えて

2

完了ブロック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() 
     } 
    }) 

} 

注:ものtableViewのごdelegatedatasourceが接続されていることを一度ご確認します。

+0

私はこのソリューションを既に試しています(これは私が書いたオリジナルのバージョンです)。これは残念ながら問題を解決しません。 –

+0

@ VictorMihaitaあなたがコードをデバッグしたことがあるのは、ブロックが実行されている場合に、コードをデバッグせずにデバッグしようとしていて、 –

+0

私はそれをやった。配列がデータベースから正しいデータを取得していて、その各要素を印刷することができます。私は正確にtableViewをリロードする前にそれを印刷していた。したがって、問題はデータを表示することだけです。 –

関連する問題