就像Firebase中的button一样

我想为我的UITableViewCell创build一个像button。 到目前为止,我设法做的是每次button被点击时用+1来更新喜欢的数量。 然而,我只希望用户能够按下一次button,如果用户再次点击该button,则用户不喜欢该post – 就像Facebook的button一样。

如果有任何帮助,我通过Facebooklogin到我的应用程序。

我的代码:

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

在这里你有我的结构在firebase: 在这里输入图像说明

希望你们能帮助我:)

如果你的JSON是这样的:

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

检索之前,你必须检查用户是否已经喜欢这个post,并相应地设置类似button的状态: –

为了存储检索到的字典,使用:

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

在你的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 } } 

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

另请参阅: – https://stackoverflow.com/a/39458044/6297658