#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!