2016-04-17 11 views
0

Ich bin ein Neuling zu schnellen und Firebase, ich versuche, meine Tabelle mit Firebase Daten zu füllen. Wenn ich das Programm starte, erscheint nichts in der Tabellenansicht. Jede Hilfe würde gerne geschätzt werden. Dies ist, was ich bisher gemacht habe, versuchte, die Dokumente zu lesen, aber es hilft nicht.Swift 2 Firebase TableView

import UIKit 
import Firebase 
import FirebaseUI 


class ChurchTableViewController: UITableViewController { 


let firebase = Firebase(url:"https://.....com/") 

var items = [NSDictionary]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    //self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

override func viewDidAppear(animated: Bool) { 

    //MARK: Load data from firebsr 
    firebase.observeEventType(.Value, withBlock: { snapshot in 
     print(snapshot.value) 
     }, withCancelBlock: { error in 
      print(error.description) 
    }) 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return items.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    let dict = items[indexPath.row] 
    cell.textLabel?.text = dict["ChurchName"] as? String 

    return cell 
} 
+0

Nach dem Download Lauf Dieser Befehl tableview.reloaddata() –

+0

Vielleicht ist Ihre URL falsch? –

+0

Es gibt ein exzellentes Tutorial genau dafür, richtig [HIER] (https://www.raywenderlich.com/109706/firebase-tutorial-getting-started) – MikeG

Antwort

2

Sie haben die Beobachter erstellt für, wenn einige Wertänderungen in Ihrer Firebase DB, aber in Ihrer Schließung müssen Sie die neuen Elemente hinzufügen und natürlich laden Sie Ihre UITableView die Daten in Ihrer App zu synchronisieren, finden Sie in der folgender Code eine Probe, um zu sehen, wie es mit einem Beispieldatentyp zu tun zu:

var items = [GroceryItem]() 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    firebase.observeEventType(.Value, withBlock: { snapshot in 
     var newItems = [GroceryItem]() 

     for item in snapshot.children { 
      let itemType = GroceryItem(snapshot: item as! FDataSnapshot) 
      newItems.append(itemType) 
     } 

     // update your item with the new ones retrieved 
     self.items = newItems 

     // reload the data 
     self.tableView.reloadData() 
    }) 
} 

In der unten struct Sie eine Probe sehen können, wie Sie Ihren Datentyp aus den Daten von Firebase

zurück erstellen

GroceryItem

struct GroceryItem { 

    let key: String! 
    let name: String! 
    let addedByUser: String! 
    let ref: Firebase? 
    var completed: Bool! 

    // Initialize from arbitrary data 
    init(name: String, addedByUser: String, completed: Bool, key: String = "") { 
    self.key = key 
    self.name = name 
    self.addedByUser = addedByUser 
    self.completed = completed 
    self.ref = nil 
    } 

    init(snapshot: FDataSnapshot) { 
    key = snapshot.key 
    name = snapshot.value["name"] as! String 
    addedByUser = snapshot.value["addedByUser"] as! String 
    completed = snapshot.value["completed"] as! Bool 
    ref = snapshot.ref 
    } 
} 

Für ein tieferes Wissen darüber, wie Firebase verwenden Sie diese sehr gutes Tutorial lesen:

hoffe, dass ich diese Hilfe Sie.

+0

Danke für Ihre Antwort, der itemType ist NSDictionay. Immer wenn ich es durch das ersetze, was du mir gegeben hast, bekomme ich einen Fehler am ---> let itemType = NSDictionay (Momentaufnahme: Element als! FDataSnapshot). Error saying (Argument-Labels '(snapshot :)' stimmen nicht mit verfügbaren Überladungen überein) –

+0

@IamWayne Es war nur ein Beispiel, natürlich müssen Sie Ihren Datentyp daraus erstellen, siehe meine aktualisierte Antwort, um die Antwort besser zu verstehen Erstellen Sie den Datentyp –

0

Überprüfen Sie, ob Sie den Delegaten und die Datenquelle Ihres Tableview ordnungsgemäß eingerichtet haben. Gehen Sie hierzu zum Schnittstellen-Generator, klicken Sie mit der rechten Maustaste auf Ihren Tabellenansicht und ziehen Sie den Mauszeiger auf das gelbe Überschriftensymbol im Interface Builder.

Sie zwei Möglichkeiten sehen sollte, ‚Datenquelle‘ und ‚delegieren‘, stellen Sie sicher, dass sie beide überprüft und dann die App erneut ausführen, sollten Sie die Tabelle mit dem, was Daten, die Sie

0

Sie geladen haben bevöl sehen‘ habe drei Ausgaben

1) Sie nicht eine Datenquelle für Ihre Tabellenansicht ausfüllen. Dies ist normalerweise ein Array, das in der Klasse gespeichert ist, und da es nach .value ist, müssen Sie über diese Werte iterieren, um zu den Daten jedes untergeordneten Knotens zu gelangen

2) Sie beobachten mit .value. Dadurch werden alle Elemente im Knoten, alle untergeordneten Elemente, ihre untergeordneten Elemente usw. zurückgegeben, sodass Sie sie nicht direkt als Zeichenfolgenwert lesen können, es sei denn, dies ist alles, was der Knoten enthält, wie in einem einzelnen Schlüssel: Wertpaar, andernfalls alle Schlüssel : Wertpaare werden gelesen.

3) Firebase asynchron ist so innerhalb der Block beobachten, müssen Sie das Array füllen, und dann neu laden Sie die Tableview

Hier ist die Lösung:

eine Struktur gegeben

users  
    user_id_0 
     name: "Biff" 
    user_id_1 
     name: "Buffy" 
    user_id_2 
     name: "Skip 

Hier ist der zugehörige Code zum Einlesen jedes Namens und zum Auffüllen eines NamensArray

Ersetzen Sie Ihr Element-Array für die NamenArray.

Schlüssel ist, um die Daten zu lassen Firebase laden asynchron vor dem Tableview zu sagen, sich zu erfrischen, und wenn .Wert verwenden, stellen Sie sicher, mit snapshot.children in diesem Knoten alle Kinder durchlaufen