Загрузка данных из firebase в tableview внутри ячейки коллекции

#ios #swift #firebase #uitableview #uicollectionview

#iOS #swift #firebase #uitableview #uicollectionview

Вопрос:

У меня есть представление коллекции, в котором вы прокручиваете по вертикали. Внутри каждой ячейки представления коллекции у меня есть tableview, который состоит из комментариев. Я загружаю данные из Firebase как в представление коллекции, так и в представление таблицы.

Что я пытаюсь сделать, так это загрузить конкретные данные и правильное количество строк в tableview внутри ячейки коллекции на основе фотоида с фотографии в моей ячейке коллекции. По сути, мне нужны правильные комментарии и правильное количество переходов к каждому tableview внутри каждой ячейки collectionviewcell

Проблема в том, что комментарии не отображаются в правильных ячейках, а также количество строк в таблицах в разных ячейках представления коллекции неверно.

в моем collectionviewcontroller я использую эту функцию для получения своих данных.

                  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

}
  

}

Представление коллекции работает нормально и так, как должно.

Это то, что я пробовал. (Это внутри ячейки 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
        }
  

photo — это мой класс модели для всей информации, связанной с настройкой ячейки представления коллекции, за исключением tableview. С помощью приведенного выше кода один конкретный комментарий, относящийся к одному конкретному изображению, иногда отображается на нескольких фотографиях.

Я был бы благодарен за помощь в решении этой проблемы. Я могу себе представить, что это как-то связано с тем, как вы перезагружаете tableview, а также определяете путь индекса в представлении коллекции.

Заранее спасибо.

Best regards, Wurzel

Комментарии:

1. Почему вы вызываете reloadData() асинхронно?

2. Хм, хороший вопрос, я думал, что должен был это сделать, потому что затем я использую массив комментариев в моем cellforrow. Как бы я это сделал вместо этого?

3. добавлен ответ ниже

4. один только хаотичный отступ кода оправдывает голосование «против».

5. Грустно слышать, как мне опубликовать весь необходимый код, чтобы понять проблему в противном случае? спасибо за отзыв.

Ответ №1:

Попробуйте удалить асинхронную функцию :

комментарии var = Комментарий

  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)
    }
  

Если это действительно проблема, я расскажу подробнее.

Комментарии:

1. Спасибо за вашу помощь. Я попробовал приведенный выше код, но по-прежнему возникает та же проблема. Я немного обновлю свой код, чтобы вы могли видеть, как я извлекаю данные из collectionview!