将数据从firebase加载到集合单元格内的tableview

Posted

技术标签:

【中文标题】将数据从firebase加载到集合单元格内的tableview【英文标题】:Load data from firebase to tableview inside a collection cell 【发布时间】:2019-04-15 19:54:38 【问题描述】:

我有一个集合视图,您可以在其中垂直滚动。在每个集合视图单元格中,我都有一个由 cmets 组成的 tableview。我将数据从 Firebase 加载到集合视图和表格视图。

我要做的是根据我的收藏单元格中照片的 photoID 在收藏单元格内的 tableview 中加载特定数据和正确的行数。基本上,我希望每个 collectionviewcell 中的每个 tableview 都有正确的 cmets 和正确的行数

问题在于 cmets 没有出现在正确的单元格中,并且不同集合视图单元格中的 tableviews 中的行数也不正确。

在我的 collectionviewcontroller 中,我使用这个 Func 来获取我的数据。

                 func fetchData()
             let ref = Database.database().reference()
            ref.child("photos").observe(.childAdded, with:  (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
            let photo = Photo(dictionary: dictionary)
            photo.videoId = snapshot.key
            self.photos.append(photo)
            if let photoId = photo.videoId
                self.photoTimeStampDictionary[photoId] = photo
            
            DispatchQueue.main.async 
                self.cView.reloadData()
            
            self.attemptReloadCollectionView()
        
    , withCancel: nil)

然后在cellforitem中。

    let photo = photos[indexPath.row]
    cell.photo = photo
    return cell
     // I then use the photo variable inside my collectionviewcell.

这是我的数据库结构:

   **Comments**
                  **randomID**

                              [commenttext: "blabla"]
                              [uid: the senders UID]
                              [photo ID: the photoID]

    **Photos**

                  **photo ID**
                              [and some more info here ofc]

我的模型课。

                 class Comment: NSObject 
                 var commentId: String?
                 var commentText: String?
                 var photoId: String?
                 var timeStamp: NSNumber?
                 var uid: String?

init(dictionary: [String: AnyObject]) 
    self.commentId = dictionary["commentid"] as? String
    self.commentText = dictionary["commenttext"] as? String
    self.photoId = dictionary["photoid"] as? String
    self.timeStamp = dictionary["timestamp"] as? NSNumber
    self.uid = dictionary["uid"] as? String


collection view 工作正常,正如它应有的那样。

这是我尝试过的。 (这是在collectionviewcell里面)

 var comments = [Comment]()

 func fetchData()
    let ref = Database.database().reference()
    ref.child("comments").observe(.childAdded, with:  (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
            let comment = Comment(dictionary: dictionary)
             //   comment.commentId = snapshot.key
            self.comments.append(comment)
            DispatchQueue.main.async 
            self.commentsTableView.reloadData()
                
            
        , withCancel: nil)
    

然后在 cellforrow 中:

        let comment = comments[indexPath.row]
        if comment.photoId == self.photo?.videoId
            cell.commentText.text = comment.commentText
        

照片是我的模型类,用于连接到设置集合视图单元格的所有信息,除了表格视图。使用上面的代码,属于一张特定图片的特定评论有时会显示在几张照片上。

如果您能解决这个问题,我将不胜感激。我可以想象它与您如何重新加载 tableview 以及检测集合视图中的索引路径有关。

提前致谢。

最好的问候, 乌泽尔

【问题讨论】:

为什么要异步调用 reloadData()? 嗯,好问题,我认为我必须这样做,因为我随后在 cellforrow 中使用了 cmets-array。我该怎么做呢? 在下方添加了答案 混乱的代码缩进本身就证明了否决票。 很遗憾听到,否则我将如何发布所有必要的代码来理解问题?感谢您的反馈。 【参考方案1】:

尝试移除异步函数:

var cmets = 评论

 func fetchData()
    let ref = Database.database().reference()
    ref.child("comments").observe(.childAdded, with:  (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
            let comment = Comment(dictionary: dictionary)
             //   comment.commentId = snapshot.key
            self.comments.append(comment)
            self.commentsTableView.reloadData()
            
        , withCancel: nil)
    

如果确实是这个问题,我会进一步详细说明。

【讨论】:

感谢您的帮助。我尝试了上面的代码,但仍然出现同样的问题。我会更新我的代码,这样你就可以看到我是如何从 collectionview 中获取数据的!

以上是关于将数据从firebase加载到集合单元格内的tableview的主要内容,如果未能解决你的问题,请参考以下文章

tableview 单元格内的集合视图重新加载数据

集合视图单元格内的表视图?

Swift - 想要在单击集合视图单元格内的按钮时进行更改

从集合 1 更新集合中的单元格内容

将数据从两个单独的 Firebase 节点加载到一个表格视图单元格中

如何在表格视图单元格内创建集合视图