Swift - 如何实现“喜欢帖子”

问题描述 投票:2回答:1

我正在使用Swift和Firebase实施问答程序。我希望用户能够喜欢问题的答案。我处理喜欢的数据库结构是:

answerLikes
   answerID 
      userID : true
answers
   ...
posts
   ...
users
   ...

我试图根据这个数据结构实现我的程序。你可以在我的TableViewController中看到代码:

@IBAction func likeButtonClicked(_ sender: UIButton) {
    if let indexPath = self.tableView.indexPathForSelectedRow {
        ref = Database.database().reference()

        print(indexPath.row)

        ref.child("answerLikes").child(answers[indexPath.row].id).observeSingleEvent(of: .value, with: {
            (snapshot) in

            let value = snapshot.value as? NSDictionary

            if value?[Auth.auth().currentUser?.uid] == nil {
                sender.setImage(UIImage(named: "filledHeart.png"), for: .normal)
                self.ref.child("answerLikes").child(self.answers[indexPath.row].id).updateChildValues([(Auth.auth().currentUser?.uid)! : true])
            } else {
                sender.setImage(UIImage(named: "emptyHeart.png"), for: .normal)
                self.ref.child("answerLikes").child(self.answers[indexPath.row].id).removeValue()
            }
        })
    }
}

我的问题是在这个函数定义中,我不知道“tapped like按钮是在哪个单元格中?”。我们使用indexPath在表视图函数中处理此问题。所以我也尝试在这段代码中使用它,但是,我的代码只有在用户单击单元格然后单击like按钮时才有效。

有人可以帮我这个吗?我真的遇到了这个“Like Post”功能的严重问题。谢谢。

ios swift firebase firebase-realtime-database
1个回答
1
投票

第一种方式

如果您使用的是自定义单元格,则可以使用协议:

protocol CustomCellDelegate: class {
    func likeButtonClicked(cell: YourCell)
}

class YourCell: UITableViewCell {
    weak var delegate: CustomCellDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    @IBAction func likeButtonTapped(sender: AnyObject){
        delegate?.likeButtonClicked(self)
    }
}

然后将委托添加到ViewController,并在cellForRowAtIndexPath中为您的单元格设置它:

cell.delegate = self

最后你可以这样使用它:

func likeButtonClicked(cell: YourCell) {
    if let indexPath = self.tableView.indexPath(for: cell) {
        //....
    }
}

第二种方式

您可以使用按钮位置获取索引:

@IBAction func likeButtonClicked(_ sender: UIButton) {
    var buttonPosition = sender.convertPoint(.zero, to: self.tableView)
    if let indexPath = self.tableView.indexPathForRow(at: buttonPosition) {
        //.....
    }
}

第三种方式

在cellForRowAtIndexPath中,您可以使用按钮标记:

likeButton.tag = indexPath.row

然后:

@IBAction func likeButtonClicked(_ sender: UIButton) {
    let cellRow = sender.tag
    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.