2017-06-12 3 views
0

Ich versuche, Daten aus einer Firebase-Datenbank in meinem TableView anzuzeigen. Der Code funktionierte mit "Tabs View Controller", aber für den Zweck des Projekts musste ich ein TableView in einen klassischen ViewController einbinden.iOS: Anzeigen von Firebase-Daten in TabelleView

Hier ist der Code, der die Daten aus der Datenbank abrufen und in der Tabellenansicht einschließen sollte.

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 
    } 

} 

Ich bekomme keinen Fehler, aber die Daten werden nicht in der Tabelle angezeigt.

Früher musste ich Override für jede Funktion verwenden, die die Tabellenansicht steuert. Wenn ich die Überschreibung nicht habe, sollte ich diese Funktionen nicht irgendwo im Code aufrufen, damit sie funktionieren? Vielen Dank.

Antwort

2

Completion Block observe rufen async und Ihre self.tableview.reloadData() vorher ausgeführt wird, so müssen Sie die tableView innerhalb des Abschluss-Block neu zu laden, nachdem Sie das Objekt in dem Feld einzufügen.

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

} 

Hinweis: bestätigen auch einmal, dass Ihre delegate und datasource von Tableview verbunden ist.

+0

Ich habe diese Lösung schon versucht (das war die ursprüngliche Version, die ich geschrieben habe). Dies behebt das Problem leider immer noch nicht. –

+0

@VictorMihaita Haben Sie Ihren Code debuggen ist, dass, wenn Block ausgeführt wird, wenn Sie den Code noch nicht debuggen, versuchen Sie, es zu debuggen und zu überprüfen, ob die Kontrolle in das geht, wenn Block oder nicht. –

+0

Ich habe es gerade getan. Das Array erhält die korrekten Daten von der Datenbank und ich könnte jedes Element davon ausdrucken. Ich habe es genau vor dem erneuten Laden des TableView gedruckt. Das Problem besteht also nur bei der Anzeige der Daten. –

Verwandte Themen