如何在 swift iOS Firestore 中获取单元格文档 ID?

Posted

技术标签:

【中文标题】如何在 swift iOS Firestore 中获取单元格文档 ID?【英文标题】:How to get the post cell documentId in swift iOS Firestore? 【发布时间】:2019-09-20 06:04:13 【问题描述】:

下面是我正在处理的代码,有用于 cmets 列表的 tableview 和 tablecells,当我单击单元格中的按钮时,如何从 firestore 获取单元格的文档 ID。它没有显示错误,但没有按要求执行,基本上在单击时我想同时检索评论 ID 和帖子 ID,正在检索帖子 ID,但每个评论的评论 ID 相同,这必须是每个评论的差异。

我收到此错误消息“'NSInvalidArgumentException',原因:'-[UITableViewCellContentView addTarget:action:forControlEvents:]: unrecognized selector sent to instance 0x7fc1a1659400'”。

class CommentListViewController: UITableViewController 
    var comments = [Comment]()
    var postCommentList:Post?
    var postId:String = ""
    var commentKey:String = ""

    override func viewDidLoad() 
        super.viewDidLoad()
        self.navigationController?.navigationBar.isTranslucent = false
        getComments()
    

    func getComments() 
        let commentsRef = Firestore.firestore().collection("posts").document(postId).collection("comments")
        commentsRef.getDocuments  (snapshot, error) in
            if let error = error 
                print(error.localizedDescription)

             else 
                if let snapshot = snapshot 
                    for document in snapshot.documents 
                        let data = document.data()
                        let username = data["comment_author_username"] as? String ?? ""
                        let comment = data["comment_author_comment"] as? String ?? ""
                        let spinnerC = data["comment_author_spinnerC"] as? String ?? ""
                        let fullname = data["comment_author_fullname"] as? String ?? ""
                        let email = data["comment_author_email"] as? String ?? ""
                        let commentUserImageUrl = data["comment_user_image"] as? String ?? ""
                        let newComment = Comment(_documentId: document.documentID, _commentAuthorUsername: username, _commentAuthorFullName: fullname, _commentAuthorComment: comment, _commentUserImage: commentUserImageUrl, _commentAuthorSpinnerC: spinnerC)
                        self.comments.append(newComment)

                    
                    self.tableView.reloadData()
                
            
        
    

    @IBAction func toAddCommentsSection(_ sender: Any) 
        performSegue(withIdentifier: "toPostComment", sender: self)
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        let vc = segue.destination as! CommentPostViewController
        vc.postId2 = postId
    

    override func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return comments.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CommentCell", for: indexPath) as! CommentCell
        cell.likebutton.tag = indexPath.row
        cell.likebutton.addTarget(self, action: #selector(likeaction1(_:)), for: .touchUpInside)
        cell.set(comment: comments[indexPath.row])

        return cell
    

    @IBAction func likeaction1(_ sender: AnyObject) 
        let commentbutton = sender as! UIButton
        let comment = comments[commentbutton.tag]
        commentKey = comment._documentId // or what key value it is
        print(postId + "   hello1  " + commentKey)
    

【问题讨论】:

你的likeaction1按钮在tableView单元格类中吗 是的,你是对的 那么问题就在这里 ***.com/questions/39947076/…。 ...检查此答案以了解按钮操作 @Wings 我提到了这个问题,但它没有帮助,它仍然给我同样的错误问题,请帮助 【参考方案1】:

试试这个,让我知道它是否有效。制作这样的按钮

class CommentCell: UITableViewCell 

@IBOutlet weak var likeButton: UIButton!

var likeButtonPressed : (() -> ()) = 


override func awakeFromNib() 
    super.awakeFromNib()



@IBAction func likeButtonTapped(_ sender: UIButton) 

    likeButtonPressed()




在 UITableView cellForRowAt 方法内部

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
let cell = tableView.dequeueReusableCell(withIdentifier: "CommentCell", for: indexPath) as! CommentCell

cell.likeButtonPressed = 
    commentKey = comments._documentId[indexPath.row]



return cell



【讨论】:

"commentKey = comment._documentId[indexPath.row]" , 'comment' 没有任何成员 "_documentId",该成员确实存在 编辑了我的答案,请检查您将所有数据存储在comments 我认为

以上是关于如何在 swift iOS Firestore 中获取单元格文档 ID?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Firestore 映射到 Swift 中的结构 - IOS

如何在 Swift 中重构重复的 Firestore 文档 ID?

如何在 Firestore (iOS) 中获取对象

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

如何在 ios 中将数据类型声明为时间戳 - swift

在 Swift 和 ios 14 中访问 Firebase Firestore 文档的字段?