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 :)

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
D. Finna
  • 467
  • 2
  • 7
  • 19
  • 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.? – Dravidian Sep 14 '16 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. – D. Finna Sep 14 '16 at 12:24

1 Answers1

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

Community
  • 1
  • 1
Dravidian
  • 9,945
  • 3
  • 34
  • 74