2016-04-28 10 views
0

// Das Beispiel unten arbeitet groß Ich bekomme das Layout, wie es aussehen sollte, aber ich möchte das Wörterbuch aus der Firebase-Funktion unten generieren.wie man Wörterbuch mit Schlüssel zur Tabellenansicht

Es sollte so etwas aussehen und ich möchte die Daten in die Tabelle. Ich bin nicht sicher, ob ich Schleife sein sollte. die Art, wie es unten ist, bringt den folgenden Fehler "fataler Fehler: unerwartet gefunden Null beim Entpacken eines optionalen Wertes" die Variablen sind nicht Null, wenn ich sie drucke, bekomme ich Daten zurück.

ref.childByAppendingPath("backend/posts").queryOrderedByChild("requestFrom").queryEqualToValue(ref.authData.uid).observeEventType(.ChildAdded, withBlock: {snapshot in 
       var firstname = snapshot.value["firstname"] as! String 
       var lastname = snapshot.value["lastname"] as! String 


     self.data = [ 
      [ 
       "firstname": firstname, 
       "lastname": lastname 
      ] 
     ] 



     print(self.data) 
    }) 







} 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! statusPrototypeCell 


    let object = data[indexPath.row] 



cell.firstname.text = object["firstname"] as! String 
    cell.lastname.text = object["lastname"] as! String 


    return cell 
} 


override func viewWillAppear(animated: Bool) { 
    navigationController?.navigationBarHidden = false 

    navigationController?.navigationBar.barTintColor = UIColor(red:0.4, green:0.76, blue:0.93, alpha:1.0) 
    navigationController?.navigationBar.translucent = false 
    self.title = "Signup" 

    self.navigationController?.navigationBar.tintColor = UIColor.whiteColor() 
    navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()] 
} 
} 
+1

'[:]' ist ein Wörterbuch kein Array –

+0

Sie sind richtig. – pprevalon

Antwort

0

Während Sie ein Dictionary als dataSource verwenden können, ist es ungeordnet, was bedeutet, dass die Elemente in Ihrem TableView ebenfalls ungeordnet sind. Die Verwendung eines Arrays ist eine bessere Lösung. In der Tat, eine Reihe von Wörterbüchern machen eine schöne geordnete Datenquelle.

Auch, um zu verdeutlichen, übergeben Sie kein Wörterbuch oder Daten zu einem TableView pro Frage. Die tableview sammelt es die Daten von einer Datenquelle über seinen Delegatmethoden

seien folgende Firebase Datenstruktur

"users" : { 
    "uid_0" : { 
     "first_name" : "Bill", 
     "last_name" : "Nye" 
    }, 
    "uid_1" : { 
     "first_name" : "Leroy", 
     "last_name" : "Jenkins" 
    }, 
    "uid_2" : { 
     "first_name" : "Peter", 
     "last_name" : "Sellers" 
    } 
    } 

und eine Reihe von Wörterbüchern zu füllen:

var usersArray: [Dictionary<String, String>] = [] 

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.observeEventType(.ChildAdded, withBlock: { snapshot in 

    var userDict = [String:String]() 
    userDict["key"] = snapshot.key 
    userDict["firstName"] = snapshot.value["first_name"] as? String 
    userDict["lastName"] = snapshot.value["last_name"] as? String   
    self.usersArray.append(userDict) 
}) 

auf die Daten zuzugreifen, verwenden die Schlüssel, die du oben erstellt hast.

Zum Beispiel: die Benutzer von einer Schaltfläche in dem Array drucken

for userDict in self.usersArray { 
    let key = userDict["key"] 
    let fName = userDict["firstName"] 
    let lName = userDict["lastName"] 

    print("\(key!) \(fName!) \(lName!)") 
} 

Sobald Sie ein Verständnis davon haben, können Sie dann die usersArray verwenden, um die Tableview zu füllen.

let userDict = usersArray[indexPath.row] 
cell.firstname.text = userDict["firstName"] as! String 
cell.lastname.text = userDict["lastName"] as! String 

Der schwierige Bit wird mit all den notwendigen Daten das Array geladen, dann nachladen die tableview es anzuzeigen. Wenn Sie einen kleinen Datensatz haben, funktioniert .Value dafür. Ein größerer Datensatz erfordert eine andere Technik, siehe This Answer

+0

eine Sache, die ich realisiere, ist, dass .ChildAdded hielt die Elemente nicht zurück. Nachdem ich das geändert hatte, konnte ich die Daten von Firebase abrufen. In der Funktion cellForRowAtIndexPath erhalte ich "fatal error: Index out of range" im "let userDict = usersArray [indexPath.row]" – pprevalon

+0

@peter Das liegt daran, dass bei der Verwendung von .Value alles in diesem Knoten zurückgegeben wird; Alle Child-Knoten, ihre Childs usw. usw. Mit .Value müssen Sie über die Child-Knoten mit * for child in snapshot.children * iterieren und dann aus jedem * child * innerhalb dieser Schleife Ihr Dictionary erstellen. Rufen Sie nach Abschluss der Schleife * tableView auf.reloadData * – Jay

+0

alles funktioniert großartig, bis ich versuche, UserDict außerhalb der Firebase Schließung in die TableView CellForRowAtIndexPath Funktion zu platzieren. Ich habe versucht, die Variable außerhalb der Firebase-Funktion zu deklarieren, bevor ich sie benutzt habe, aber kein Glück. Ich versuche auch, die Firebase-Funktion innerhalb einer Funktion zu verwenden, aber wieder wird es in einem Verschluss sein, so dass es nicht funktioniert. Ich habe mir die Haare ausgezogen, um das herauszufinden, aber kein Glück. – pprevalon

0

Sie Wörterbuch verwenden, so dass es so besser nicht Zählwert Rückkehr Array verwenden wie [] anstelle von [:]

Eine weitere Sache Sie die folgende Anweisung vergessen haben in ViewDidLoad Verfahren einzubeziehen myTableView.delegate = self

+0

@raamaKrisma Ich konnte das Wörterbuch an den Tisch stellen, das Problem, dass ich jetzt die Daten erzeuge, bekomme ich eine nil Antwort. Ich bin mir nicht sicher, warum bitte einen Blick auf die Frage bearbeiten. – pprevalon

Verwandte Themen