2016-09-14 2 views
2

Я пытаюсь создать понравившуюся кнопку для моего UITableViewCell. То, что мне удалось сделать до сих пор, - это обновить количество понравившихся +1 при каждом нажатии кнопки. Тем не менее, я хочу, чтобы пользователь только один раз нажал кнопку, и если он снова щелкнет одним и тем же пользователем, пользователь не отскакивает от поста - так же, как и кнопка facebook.Как кнопка в Firebase swift

Если это какая-либо помощь, я могу войти в свое приложение через facebook.

Мой код:

@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: enter image description here

Упование вы, ребята, можете помочь мне :)

+0

Попробуйте напечатать 'pathDB' перед' prntRef.runTransactionBlock ({... ', что вы получаете? я предполагаю, что вы получите его nil.And, где вы объявили 'pathDB', и где вы его инициализируете? – Dravidian

+0

pathDB инициализируется, и я не получаю ничто, поскольку я печатаю dataPathen, который является pathDB. С кодом не возникает проблем, я просто прошу помощи в реализации подобной кнопки, у которой есть функции, о которых я говорил выше. Можете ли вы это сделать? Я хотел бы заплатить вам за ваше время. –

ответ

3

Если 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" 
        } 
      }, 
     } 
    } 

Перед получением вы должны проверить, если пользователь уже понравился этот пост, и установить состояние кнопки, как соответственно: -

Для хранения извлеченного словаря использования: -

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

+0

Дайте мне знать, если вы получите это для работы. – Dravidian

+0

Я, к сожалению, не могу. Я не могу заставить его работать с моим собственным кодом. –

+0

Я боюсь, что это поможет вам, как вы можете получить здесь ... Но основная концепция, которая лежит одна и та же ... – Dravidian