2

I am trying to create a like button for my UITableViewCell. What I have managed to do so far is update the number of likes with +1 everytime the button is clicked. I, however, only want the user to be able to press the button once, and if it is clicked again by the same user, the user is unliking the post - just as the facebook like button.

If it is any help, I am signing in to my app via facebook.

My 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() } }) } 

Here you have my structure in firebase: enter image description here

Hope you guys can help me :)

2
  • Try printing pathDB before prntRef.runTransactionBlock({ ... , what do you get? my guess is that you would be getting it nil.And where have you declared pathDB , and where are you initialising it.? Commented Sep 14, 2016 at 12:17
  • pathDB is being initialized and I am not getting a nil as I am printing dataPathen which is pathDB. There isn't a problem with the code, I am just asking for help implementing a like button that have the features I stated above. Can you do that? I would like to pay you for your time. Commented Sep 14, 2016 at 12:24

1 Answer 1

3

If your JSON is something like this:-

{ 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" } }, } } 

Before retrieving you will have to check if the user had already liked this post, and set the state of the like button accordingly:-

For storing the retrieved dictionary use:-

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 your 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 } } 

You 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() } } } 

Also see :-https://stackoverflow.com/a/39458044/6297658

Sign up to request clarification or add additional context in comments.

3 Comments

I don't unfortunately.. I cannot get it to work with my own code.
I'm afraid this is as much help as you can get here.... But the basic concept that lies is same...
May I ask, why you store likes inside NSMutableDictionary?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.