1

Ich implementiere eine Frage & Antwort-Programm in Swift, mit Firebase. Ich möchte eine ähnliche Schaltfläche in meiner TableViewCell haben. Ich habe jedoch ein Problem, weil die Daten des Beitrags in der TableView-Klasse sind und ich Änderungen an der Schaltfläche "Like" in der Klasse "TableViewCell" vornehmen kann. Ich brauche eine Datenübertragung zwischen diesen beiden. Kann mir jemand dabei helfen?Swift Firebase Wie Beitrag in der Tabellenansicht

Wenn es geht um Ihnen zu helfen, mein Problem, Code in meiner Tabelle Ansicht zu verstehen:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let answerCell = tableView.dequeueReusableCell(withIdentifier: "AnswerCell") as! AnswerCell 

     let answer = answers[indexPath.row] 

     answerCell.answerText.text = answer.answerText 
     answerCell.username.text = "~ \(answer.username)" 
     answerCell.numberOfLikes.text = "\(answer.numberOflikes) liked this answer." 

     answerCell.answerText.numberOfLines = 0 

     return answerCell 
    } 

ich einen Code wie dies in meiner Tableview Zelle haben will. Ich kann jedoch nicht auf die Daten des Antwortobjekts zugreifen.

@IBAction func likeButtonClicked(_ sender: UIButton) { 
    ref = Database.database().reference() 

    ref.child("answerLikes").child((answer.id).observeSingleEvent(of: .value, with: { 
     (snapshot) in 
     if let _ = snapshot.value as? NSNull { 
      sender.setImage(UIImage(named: "filledHeart.png"), for: .normal) 
     } else { 
      answerLikes = [Auth.auth().currentUser?.uid : true] 
      ref.child("answerLikes").child(answer.id).updateChildValues(answerLikes) 
      sender.setImage(UIImage(named: "emptyHeart.png"), for: .normal) 
     } 
    }) 
} 
+0

Wo Methode 'likeButtonClicked' platziert werden? –

+0

Es ist in der AnswerCell. Sollte es in der Tabellenansicht Controller sein? Vielen Dank für Ihre Antwort. – atunaysaka

Antwort

0

AKTUALISIERT

Dies ist Lösung, wenn Sie gefragt, „ich nicht die Daten des Antwort-Objekt zugreifen können“

Sie können eine Methode in answerCell schaffen, die eine Antwort Objekt erhalten.

func recieveAnswerObject(answer : Answer){ 
    // here you will get answer object 
    // here i am assuming Answer is your model class 
} 

// jetzt Zeit, es von Ihrem Haupt UIViewController Klasse aufzurufen Antwort-Objekt für den Teil

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let answerCell = tableView.dequeueReusableCell(withIdentifier: "AnswerCell") as! AnswerCell 

    let answer = answers[indexPath.row] 
    // from here we send answer object 
    answerCell.recieveAnswerObject(answer) 
    answerCell.answerText.text = answer.answerText 
    answerCell.username.text = "~ \(answer.username)" 
    answerCell.numberOfLikes.text = "\(answer.numberOflikes) liked this answer." 

    answerCell.answerText.numberOfLines = 0 

    return answerCell 
} 

Jetzt zu schicken, wo Sie gefragt, wie Transfer auf Daten zwischen diesen beiden Klasse

Erste So erreichen Sie dies

1.Erstellen Sie einen Delegaten in der AnswerCell-Klasse und bestätigen Sie dies Ihrem Controller, wo Sie Ihren tableView-Code geschrieben haben.

2.Wenn Sie auf die Schaltfläche klicken, wird ein Delegat ausgelöst und Sie erhalten einen Rückruf in Ihrem mainViewController.

zweite Möglichkeit diesen

1.Make ein IBOulet für likeButtonClicked in AnswerCell Klasse zu erreichen.

2. Machen Sie keine IBAction.

3.Your Code wird wie folgt aussehen

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let answerCell = tableView.dequeueReusableCell(withIdentifier: "AnswerCell") as! AnswerCell 
    // action added to button 
    answerCell.likeButtonClicked.addTarget(self, action: #selector(likeButtonClicked), for: .touchUpInside) 
    // updated set tag to button 
    answerCell.likeButtonClicked.tag = indexPath.row 
    let answer = answers[indexPath.row] 
    answerCell.answerText.text = answer.answerText 
    answerCell.username.text = "~ \(answer.username)" 
    answerCell.numberOfLikes.text = "\(answer.numberOflikes) liked this answer." 

    answerCell.answerText.numberOfLines = 0 

    return answerCell 
} 

und schreiben Sie Ihren Code unten in der Tableview Klasse

@IBAction func likeButtonClicked(_ sender: UIButton) { 
//updated now tag is row position of button in cell and is equal to  (indexPath.row) of that particular button.tag is equal to 
let tag = sender.tag 
// here indexPath.row can be replace by tag so 
    //let answer = answers[indexPath.row] == let answer = answers[tag] 
    // updated till here 
ref = Database.database().reference() 

ref.child("answerLikes").child((answer.id).observeSingleEvent(of: .value, with: { 
    (snapshot) in 
    if let _ = snapshot.value as? NSNull { 
     sender.setImage(UIImage(named: "filledHeart.png"), for: .normal) 
    } else { 
     answerLikes = [Auth.auth().currentUser?.uid : true] 
     ref.child("answerLikes").child(answer.id).updateChildValues(answerLikes) 
     sender.setImage(UIImage(named: "emptyHeart.png"), for: .normal) 
    } 
}) 
    } 
+0

Vielen Dank für Ihre Antwort, aber in likeButtonClicked Aktion in der Tabellenansicht erstellt werden, kann ich nicht schreiben "Kind (answer.id)", da ich keine Antwort habe. Ich behalte Antworten Liste und Zugriff auf eine einzige Antwort als Antworten [indexPath.row] in der Tabellenansicht Funktion. Irgendwelche Hilfe dazu bitte? – atunaysaka

+0

Sie können meine aktualisierte Antwort überprüfen. Ich habe markiert als aktualisiert, wo ich Änderungen vorgenommen habe. Hoffe erhalten Sie Ihre Antwort. Lassen Sie mich wissen, wenn Gesicht irgendein Problem in Bezug auf obige Lösung – Vikky

+0

Ich habe meine Antwort, das ist die genaue Lösung, die ich brauche . Vielen Dank für Ihre Antwort! – atunaysaka

Verwandte Themen