2016-09-14 6 views
2

Ich versuche, eine ähnliche Schaltfläche für meine UITableViewCell zu erstellen. Was ich bisher geschafft habe, ist, die Anzahl der Likes mit +1 zu aktualisieren, immer wenn auf die Schaltfläche geklickt wird. Ich möchte jedoch nur, dass der Benutzer den Knopf einmal drücken kann, und wenn er von demselben Benutzer erneut angeklickt wird, hebt der Benutzer den Beitrag auf - ebenso wie der Facebook-ähnliche Knopf.Schaltfläche in Firebase swift

Wenn es Hilfe ist, melde ich mich über Facebook bei meiner App an.

Mein Code:

@IBAction func likeTapped(sender: AnyObject) { 
     //print(pathDB) 
     FIRDatabase.database().reference().child("feed-items").child(pathDB).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      // Get user value 
      let antalLikes = snapshot.value!["likesForPost"] as! Int 
      print(antalLikes) 
      let dataPathen = self.pathDB 
      print(dataPathen) 

       self.updateTotalNoOfPost{ 
        print("Updated") 
       } 

      // ... 
     }) { (error) in 
      print(error.localizedDescription) 
     } 
    } 

    func updateTotalNoOfPost(completionBlock : (() -> Void)){ 

     let prntRef = FIRDatabase.database().reference().child("feed-items").child(pathDB).child("likesForPost") 

     prntRef.runTransactionBlock({ (resul) -> FIRTransactionResult in 
      if let dealResul_Initial = resul.value as? Int{ 

       resul.value = dealResul_Initial + 1 
       //Or HowSoEver you want to update your dealResul. 
       return FIRTransactionResult.successWithValue(resul) 
      }else{ 
       return FIRTransactionResult.successWithValue(resul) 
      } 
      }, andCompletionBlock: {(error,completion,snap) in 

       print(error?.localizedDescription) 
       print(completion) 
       print(snap) 
       if !completion { 
        print("Couldn't Update the node") 
       }else{ 
        completionBlock() 
       } 
     }) 
    } 

Hier können Sie meine Struktur in Feuerbasis haben: enter image description here

hoffe, euch kann mir helfen :)

+0

Versuchen Sie 'pathDB' vor' prntRef.runTransactionBlock ({... ', was bekommen Sie? Meine Vermutung ist, dass Sie es nil bekommen würden. Und wo haben Sie 'pathDB' erklärt, und wo initialisierst du es? – Dravidian

+0

pathDB wird initialisiert und ich bekomme keine Null, da ich dataPathen drucke, was pathDB ist. Es gibt kein Problem mit dem Code, ich frage nur nach Hilfe bei der Implementierung eines Like-Buttons mit den oben genannten Funktionen. Können Sie das tun? Ich möchte dich für deine Zeit bezahlen. –

Antwort

3

Wenn Ihr JSON so etwas wie dieses: -

{ 
    feed-items: { 
    feedItem1 :{ 
      feedText : "This is feed1", 
      feedLikes : {uid1 : "true", 
         uid2 : "true" 
        } 
      }, 
     feedItem2 :{ 
      feedText : "This is feed2", 
      feedLikes : {uid13 : "true", 
         uid2 : "true" 
        } 
      }, 
     feedItem3 :{ 
      feedText : "This is feed4", 
      feedLikes : {uid4 : "true", 
         uid10 : "true" 
        } 
      }, 
     } 
    } 

Vor Abrufen müssen Sie überprüfen, ob der Benutzer bereits diesen Beitrag gefallen hatte, und stellen Sie den Zustand der Schaltfläche entsprechend: -

Für die abgerufene Wörterbuch Verwendung zu speichern: -

struct feed { 

    var feedLikes : NSMutableDictionary! 
    var feedText : String! 
    var doILikeThisPost : Bool! 
    var feedNameI : String! 

    init(likes:NSMutableDictionary!, feed : String!, likeTisPost : Bool!, feedNM : String!){ 

     self.doILikeThisPost = likeTisPost 
     self.feedLikes = likes 
     self.feedText = feed 
     self.feedNameI = feedNM 
    } 

} 

In Ihrem Tableviewcontroller : -

import UIKit 
import Firebase 
class customTableViewController : UIViewController, UITableViewDelegate ,UITableViewDataSource{ 


var feedD = [feed]() 
@IBOutlet wear var customTableView : UITableView! 


override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    customTableView.delegate = self 
    customTableView.dataSource = self 
    retrieveTheData() 


} 





func retrieveTheData(){ 

    FIRDatabase.database().reference().child("feed-items").observeSingleEventOfType(.Value, withBlock: {(allFeeds) in 

     if let feedDict = allFeeds.value as? [String: AnyObject]{ 

      for each in feedDict{ 

       if let feedLikesDict = each.1["feedLikes"] as? NSMutableDictionary{ 

        if feedLikesDict[currentUerID] != nil{ 

         let temp = feed.init(likes: feedLikesDict, feed: each.1["feedText"] as! String, likeTisPost: true, feedNM : each.0) 
         self.feedD.insert(temp, atIndex: 0) 
         self.customTableView.reloadData() 
        }else{ 

         let temp = feed.init(likes: feedLikesDict, feed: each.1["feedText"] as! String, likeTisPost: false, feedNM : each.0) 
         self.feedD.insert(temp, atIndex: 0) 
         self.customTableView.reloadData() 
        } 
       }else{ 

        let temp = feed.init(likes: nil, feed: each.1["feedText"] as! String, likeTisPost: false, feedNM : each.0) 
        self.feedD.insert(temp, atIndex: 0) 
        self.customTableView.reloadData() 

       } 

      } 
     } 

    }) 
} 




func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.customTableView.dequeueReusableCellWithIdentifier("CELL") as! customCell 

    if feedD[indexPath.row].doILikeThisPost == true{ 

     cell.feedLikeBtn.selected = true 
     cell.feedTextPost = feedD[indexPath.row].feedText 
     cell.feedName = feedD[indexPath.row].feedNameI 
     cell.parentTableViewController = self 
     cell.indexPathForRow = indexPath.row 
    }else{ 

     cell.feedLikeBtn.selected = false 
     cell.feedTextPost = feedD[indexPath.row].feedText 
     cell.feedName = feedD[indexPath.row].feedNameI 
     cell.parentTableViewController = self 
     cell.indexPathForRow = indexPath.row 
    } 


    return cell 
    } 



} 

Sie customTableViewCell: -

class customCell : UITableViewCell{ 

@IBOutlet weak var feedLikeBtn : UIButton! 
var feedTextPost = String() 
var feedName = String() 
var indexPathForRow : Int! 


var parentTableViewController : customTableViewController! 

@IBAction func likeBtn(sender:UIButton!){ 

    if sender.selected == false{ 

     FIRDatabase.database().reference().child("feed-items").child(feedName).child("feedLikes").updateChildValues([currentUserID : "true"]) 
     self.parentTableViewController.feedD[self.indexPathForRow].feedLikes.setObject("true", forKey: currentUserID) 
     self.parentTableViewController.feedD[self.indexPathForRow].doILikeThisPost = true 
     self.parentTableViewController.customTableView.reloadData() 


    }else if sender.selected == true{ 

     FIRDatabase.database().reference().child("feed-items").child(feedName).child("feedLikes").child(currentUserID).removeValue() 
     self.parentTableViewController.feedD[self.indexPathForRow].feedLikes.removeObjectForKey(currentUserID) 
     self.parentTableViewController.feedD[self.indexPathForRow].doILikeThisPost = false 
     self.parentTableViewController.customTableView.reloadData() 

     } 


    } 

} 

Siehe auch: - https://stackoverflow.com/a/39458044/6297658

+0

Lassen Sie mich wissen, wenn Sie das zum Arbeiten bekommen .. – Dravidian

+0

Ich nicht leider .. Ich kann es nicht mit meinem eigenen Code arbeiten. –

+0

Ich fürchte, das ist so viel Hilfe, wie Sie hier bekommen können .... Aber das Grundkonzept, das liegt, ist das gleiche ... – Dravidian