2016-05-15 25 views
1

Im Grunde habe ich Schwierigkeiten, den Wert von Firebase in einer Tabellenansicht zu ändern. Ich versuche gerade, eine Facebook-Post-Like-Funktion zu erstellen, die es Nutzern ermöglicht, Ihren Post zu mögen. Ich bin mir jedoch nicht ganz sicher, wie ich damit weitermachen würde. Ich möchte dem Benutzer die Möglichkeit geben, jeden Post zu mögen, und dann die vorherigen Likes + das, was gegeben wurde, zu speichern und in Firebase zu aktualisieren. Im Moment habe ich nur den Code, um jeden Beitrag anzuzeigen, und auch die @IBAction von der Schaltfläche (Like-Schaltfläche).Swift/Firebase Änderungswert von der Tabellenansicht

Ich bin mir nicht sicher, wie ich es schaffen würde, auf jeden spezifischen Beitrag nur über die Tabellenansicht zuzugreifen, mit indexPath.row (?). Hier ist der Code, den ich bisher habe:

Beitrag bearbeiten:

Also im Grunde habe ich eine Tableview, eine Tabellenansicht Zelle enthält, zeigt die Menge an Leuten jeder Beitrag hat. Um dies zu tun, habe ich diesen Code in meinem viewDidLoad(), um nur die Daten von Firebase zu holen:

ref.childByAppendingPath("posts").queryOrderedByChild("timeRegistered").observeEventType(FEventType.ChildAdded) { (snapshot:FDataSnapshot!) in 

     var dict = [String:String]() 
     dict["keys"] = snapshot.key as? String 
     dict["votes"] = snapshot.value["likes"] as? String 
     self.posts.append(dict) 

     self.tableView.reloadData() 


    } 

nur zu erwähnen, dieser Code funktioniert, indem Sie mit diesem Code in der cellForRowAtIndexPath: cell.textLabel!.text = String(posts[indexPath.row]["names"]!)

ich dachte aber, dass der Code, den ich in viewDidLoad verwendet (.ChildAdded Funktion) würde auch mit ChildChanged arbeiten, so ist es das, was ich kam mit:

ref.childByAppendingPath("posts").queryOrderedByChild("timeRegistered").observeEventType(FEventType.ChildChanged) { (snapshot:FDataSnapshot!) in 

     var dict = [String:String]() 
     dict["keys"] = snapshot.key as? String 
     dict["votes"] = snapshot.value["votes"] as? String 
     self.posts.append(dict) 

     self.tableView.reloadData() 


    } 

Leider sieht es aus wie das Tableview nur die zeigt neuer Wert (der Wert wurde von einem geändert IBAction, ich stelle auch diesen Code zur Verfügung.) - während der alte Wert einfach dort bleibt. Dies ist der Code zum Ändern Wert:

var key = posts[1]["keys"] 
    ref.childByAppendingPath("posts").childByAppendingPath(key!).updateChildValues(["name":"Test name"]) 
    tableView.reloadData() 

Immer noch versuchen, einen besseren Weg, den genauen Wert zu ändern, durch Index, um herauszufinden - aber das ist nicht der Fall jetzt (also Beiträge [1] [ „Schlüssel“]). Scheinen Sie zu verstehen, was das Problem ist?

Zusammenfassend: Ich möchte auf eine Schaltfläche in einer Tabellenansicht Zelle klicken, und fügen Sie ein ähnliches zu dem bestimmten Beitrag, und aktualisieren Sie die Gesamtzahl in Echtzeit.

+1

Es ist ein wenig unklar, was Sie zu tun versuchen; und auch, was ist die Schnittstelle? Sind "Stimmen" und "Gefällt mir" dasselbe? Eine einfache Lösung wäre eine kleine + Schaltfläche in jeder Zeile und wenn der Benutzer auf das + klickt, werden die Bewertungen/Likes erhöht. Sie wissen, welche Zeile über clickedRow angezeigt wird, oder haben eine benutzerdefinierte Zelle, die den Klick verarbeitet. – Jay

+0

Also im Grunde möchte ich die 'Likes'-Funktion hinzufügen, wie Sie es nennen können - und ich möchte, dass es die Datensätze sofort aktualisiert, nachdem' Like 'gedrückt wurde (alte Likes + 1 neue Like). – askaale

+0

Ich denke schon ... Mach es nicht kompliziert. Haben Sie einfach eine IBAction, die auf das Klicken auf eine + Schaltfläche reagiert. Ermitteln Sie, auf welche Zeile geklickt wurde, rufen Sie dann die aktuellen Likes aus Ihrem Array von Posts [clickedRow] ab, inkrementieren Likes und aktualisieren dann den Wert in Firebase über den Firebase-Schlüssel für diese Zeile und den untergeordneten Knoten likes.setValue (votes). – Jay

Antwort

2

Es gibt mehrere Antworten so hier ein paar Dinge ist:

Die ChildChanged Veranstaltung ist ein Problem. Wenn ein Kind geändert wird, wird es vom Code an das Array angehängt, wodurch ein doppeltes Kind mit anderen Daten entsteht. Was Sie tun sollten, ist festzustellen, welches Kind es ist, holen Sie dieses Wörterbuch aus dem Array und aktualisieren Sie die Werte mit den neuen Werten.

Die folgenden Kommentare fragen "Wie machst du das?".

Je nachdem, wie Sie Ihre Daten speichern möchten, gibt es verschiedene Möglichkeiten. Ich gebe zwei Beispiele:

Angenommen, Sie haben eine Post-Struktur (Objekt), die Informationen über jeden Beitrag enthält. Dies ist eine bessere Lösung, als mit Wörterbüchern zu arbeiten.Die Struktur enthält die Feuerbasis Schlüssel, die msg und die Benutzer-ID des Benutzers, den die Post gemacht und Sie speichern diese Beiträge in einem postsArray

struct Post { 
    var firebaseKey : String? 
    var msg: String? 
    var uid: String? 

    init(aFirebaseKey: String, aMsg: String, aUid: String) { 
     self.firebaseKey = aFirebaseKey 
     self.msg = aMsg 
     self.uid = aUid 
    } 
} 

var postsArray = [Post]() 

und nehmen Sie die Beiträge Knoten für Änderungen beobachten:

postsRef.observeEventType(.ChildChanged, withBlock: { snapshot in 
    let changedKey = snapshot.key //the firebase key 
    if let index = self.postsArray.indexOf({$0.firebaseKey == changedKey}) { 
    print(index) //index is the index of the Post in the array 
    let changedPost = self.postsArray[index] 
    //update the values 
    self.tableView.reloadData 
} 

und es abgeschlossen ist, der anfängliche Laden des Pfostens

postsRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 

    let theKey = child.key as String 
    let theMsg = child.value["msg"] as! String 
    let theUid = child.value["user"] as! String 

    let p = Post(aFirebaseKey: theKey, aMsg: theMsg, aUid: theUid) 

    self.postsArray.append(p)    
    } 
}) 

Eine weitere Option zu machen, ist Seitenarrays von Seite zu halten.

keysArray[String]() 
valuesArray[Dictionary]() 

Mit ähnlichen Code, in dem childChanged Ereignis die Feuerbasis Schlüssel bekommen und dann einfach den Schlüssel in der keysArray finden, die es den Index zurück. Verwenden Sie dann den zurückgegebenen Index, um die Werte von valuesArray abzurufen. Aktualisieren Sie sie und reloadTableview.

let index= keysArray.indexOf(firebaseKey) //get the index for this post 

let postToUpdate = self.valuesArray[index] 
//update the Post 

Natürlich, wenn zunächst die Arrays Laden, setzen Sie die Schlüssel in der keysArray und die Werte in dem Arraywert

Verwandte Themen