ios - 将索引路径发送到 Firebase(如按钮)

标签 ios swift uitableview firebase-realtime-database

我有一个表格 View ,单元格中填充了来自 Firebase 的数据。在每个单元格中都有一个喜欢的按钮,当我喜欢特定单元格中的按钮时,它会捕获该单元格的 ID 并在 Firebase 中创建一个节点,让我知道该按钮已被单击(喜欢)。按钮在点击前是白色的,点击后变成红色。然后,如果再次单击它(不喜欢),它会变成白色。

 @IBAction func LikeClicked(_ sender: UIButton) -> Void {

        let LikedRef = FIRDatabase.database().reference().child("Likes").child((self.loggedInUser?.uid)!)

        let indexPath = self.selectedIndex
        let post = self.posts![(indexPath?.row)!] as! [String: AnyObject]
        self.key = post["postID"] as? String

        let cell = TableView.cellForRow(at: indexPath!) as! ProfileTableViewCell


        if cell.Like.currentImage == #imageLiteral(resourceName: "icons8-Hearts Filled-50 (2)"){
            cell.Like.setImage(#imageLiteral(resourceName: "icons8-Heart-50"), for: .normal)
            // cell.RedLike.isHidden = true

            FIRDatabase.database().reference().child("Likes").child((self.loggedInUser?.uid)!).child(self.key!).removeValue(completionBlock: { (error, ref) in
                if error != nil {
                    print("error \(error)")
                }else{

                }})
        } else{

            LikedRef.observeSingleEvent(of: .value, with: { (snapshot:FIRDataSnapshot) in


                if let postsDictionary = snapshot .value as? [String: AnyObject] {


                    var LikeStatus = postsDictionary[self.key!] as? String ?? ""

                    if self.key == LikeStatus
                    {
                        // cell.Like.isHidden = true

                        cell.Like.setImage(#imageLiteral(resourceName: "icons8-Hearts Filled-50 (2)"), for: .normal)

                    }


                }})



            LikedRef.updateChildValues([self.key!: self.key!])


        }


    }

  cell.Like.addTarget(self, action: #selector(LikeClicked), for: UIControlEvents.touchUpInside)
    cell.Like.tag = indexPath.row
    print(indexPath.row)
    cell.Like.isUserInteractionEnabled = true

我的问题是,当我喜欢特定单元格上的一个按钮时,每个单元格中的所有类似按钮都会变成红色。但我只希望我点击的单元格变为红色,当我离开应用程序并返回时,所有按钮都恢复为白色。我希望登录用户喜欢的任何按钮都保持红色,无论用户是否退出应用程序。

最佳答案

好的,所以我花了一个小时左右的时间来让您了解如何做您需要做的事情。喜欢和不喜欢您的自定义 UITableViewCell。我在每一行代码中都解释了我所做的细节。我希望这可以帮助你。如果您有任何疑问,请告诉我。请记住,这只是您完成任务的众多方式之一。

MyViewController.swift

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, MyCustomCellDelegate {

    // This is the array of keys that we
    var likedDataKeys = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Load here the 'Likes' stuff and store its in a datasource for reference or store as well its keys.
        // If data is liked, store to likedDayaKeys the key of your data.

        FirebaseCall {
            if liked {
                self.likedDataKeys.append(keyOfYourData)
            }
        }
    }

    // MARK: - UITableViewDataSource

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = ....

        // Set the image.

        let dataKey = yourDatasource[indexPath.row] // get the key or whatever data you need

        // Set the delegate and key
        cell.delegate = self
        cell.dataKey = dataKey

        if likedDataKeys.contains(dataKey) {
            cell.image = redImageLike
        } else {
            cell.image = whiteNormalLikeImage
        }

        return cell
    }

    // MARK: - MyCustomCellDelegate

    func myCustomCell(userDidTapLikeWithDataKey dataKey: String) {
        // So now we can get the dataKey of the cell that is being liked or unliked.
        // Check from the self.likedDataKeys if the tapped cell is liked or not.

        if self.likedDataKeys.contains(dataKey) {
            // If it is there, then we should call the unlike Firebase.
            // Also remove it from the self.likedIndexPath and reload the tableView to update the image.

            let index = self.likedDataKeys.index(of: dataKey)
            self.likedDataKeys.remove(at: index)

            // Call now the unlike Firebase.

        } else {
            // If it is not there, then we should call the like Firebase.
            // Also store it to the self.likedIndexPAth
        }
    }
}

MyCustomCell.swift

protocol MyCustomCellDelegate: NSObjectProtocol {
    // This is the delegate that will help us send the dataKey reference to the viewController
    // Whenever the user taps on the like button in the cell.
    func myCustomCell(userDidTapLikeWithDataKey dataKey: String)
}

class MyCustomCell: UITableViewCell {

    // This will be called in the viewController, pass here the self of the viewController
    weak var delegate: MyCustomCellDelegate?

    // Make sure to pass here the key from the cellForRow of the viewController's tableView delegate.
    var dataKey = ""

    @IBAction func LikeClicked(_ sender: UIButton) -> Void {
        // Call the delegate to inform the viewController
        self.delegate?.myCustomCell(userDidTapLikeWithDataKey: self.dataKey)
    }
}

关于ios - 将索引路径发送到 Firebase(如按钮),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46840309/

相关文章:

ios - 我可以使用哪些 iPhone OS API 来实现类似于 iBook 翻页过渡的过渡动画?

ios - 获取从 UIImagePickerController 中选择的 UIImage 的 URL

ios - 如何在 Swift 中使用 NSURLSessionDataTask

ios - 来自核心数据的数据不会显示在表格单元格中(使用 FetchResultsController)

ios - 如何使用 Swift 按字母顺序将 TableView 数据分成几部分? (重写)

ios - 无法使 mediaPlayer View 在 UIView 内水平旋转

ios - 如何在 iOS 14 的内联样式日期选择器顶部设置时间选择器?

ios - Swift - 从一年中的某一天获取日期

ios - 如何仅模糊 uitableview 滚动的部分

ios - iPhone ios 上的 swift 3 中的弹出窗口