У меня есть CollectionView, который я заполняю из своей функции loadData, в которой я использую DispatchGroup, чтобы убедиться, что вся информация загружена правильно.Затем он помещается в два массива: posts и userInfo, которые содержат очевидную информацию: posts содержат все данные определенного поста, включая userID от автора, userInfo содержит все данные, основанные на userID.
Чтобывает, он показывает все отлично, даже мой автопутешествие идеально.Когда нет «заметки», ограничения меняются, все работает.Однако, когда я прокручиваю вниз, или иногда последнюю ячейку (в зависимости от высоты ячейки, я думаю, заметка заметна или нет), заметка не отображается.
Изображение выше должно показать, что я имею в виду: слева 7 постов, справа 8 постов.С обеих сторон вы можете видеть, что первое сообщение (или сообщения) после прокрутки или в конце CollectionView не содержат заметку, но ячейка достаточно высока, чтобы она могла поместиться.
Этомое понимание того, что проблема возникает в методе cellForItemAt.В методе sizeForItemAt, где высота рассчитывается на основе длины заметки, все идет хорошо (потому что высота ячейки хорошо адаптируется).
Вот так выглядит мой метод cellForItemAt:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let socialCell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! socialCell
if let userID = posts[indexPath.item].userID {
if let userFirstName = userInfo[userID]?.userFirstName, let userLastName = userInfo[userID]?.userLastName {
socialCell.usernameLabel.text = userFirstName + " " + userLastName
}
}
if let wsName = posts[indexPath.item].postName {
socialCell.postNameLabel.text = wsName
}
socialCell.noteTextView.text = posts[indexPath.item].postNote
if(posts[indexPath.item].postNote == "") {
socialCell.noteTextView.removeFromSuperview()
socialCell.postDetailsView.bottomAnchor.constraint(equalTo: socialCell.noteTextView.bottomAnchor).isActive = false
socialCell.postDetailsView.bottomAnchor.constraint(equalTo: socialCell.postNameLabel.bottomAnchor).isActive = true
}
// all other elements are set here, precisely the same way as the name of the post, so irrelevant
socialCell.layer.shouldRasterize = true
socialCell.layer.rasterizationScale = UIScreen.main.scale
return socialCell
}
Я думаю, что это как-то связано с indexPath.item - каким-то образом, когда я прокручиваю или достигаю конца видимой области (когда вызывается cellForItemAt, я полагаю?), IndexPath отключается, сбрасывается,... или что-то в этом роде.
Любая идея о том, как это исправить, будет искренне оценена.Заранее спасибо!
РЕДАКТИРОВАТЬ: Я сейчас печатаю некоторую информацию, потому что хочу добавить фотографии профиля, но заметил кое-что полезное:
print(userFirstName, " (", indexPath.item, "): ", userProfilePicURL)
Я печатаю Имя, IndexPath и URL-адрес изображения профиля, которое при загрузке выдает этот вывод (он содержит правильный URL, я его просто спрятал):
Penny ( 0 ): URL
Penny ( 1 ): URL
Penny ( 3 ): URL
Penny ( 4 ): URL
Penny ( 0 ): URL
Penny ( 1 ): URL
Andrea ( 2 ): URL
Penny ( 3 ): URL
Penny ( 4 ): URL
Andrea ( 5 ): URL
ДваНаблюдения: вывод возвращается дважды, поэтому я думаю, что ячейки перезагружаются дважды.И в первый раз indexPath 2 и 5 отсутствует.Вот как я получаю данные и перезагружаю CollectionView в loadData:
var Ref: DatabaseReference!
Ref = Database.database().reference()
Ref.child("posts").queryOrdered(byChild: "postReverseTimeStamp").observeSingleEvent(of: .value) { (snapshot) in
let dataGroup = DispatchGroup()
for child in snapshot.children {
dataGroup.enter()
let snap = child as! DataSnapshot
let dict = snap.value as! [String: Any]
self.posts.append(post(postID: snap.key, userID: dict["userID"] as! String, postName: dict["postName"] as! String, postNote: dict["postNote"]! as! String, postDuration: dict["postDuration"]! as! Int, postTimeStamp: dict["postTimeStamp"] as! TimeInterval, postLikes: dict["postLikes"]! as! Int, postComments: dict["postComments"]! as! Int))
Ref.child("users").child(dict["userID"] as! String).observeSingleEvent(of: .value) { (snapshot) in
let userValues = snapshot.value as! [String: Any]
userInfo[dict["userID"] as! String] = userData(userFirstName: userValues["userFirstName"] as? String, userLastName: userValues["userLastName"] as? String, userProfilePicURL: userValues["userProfilePicURL"] as? String)
dataGroup.leave()
DispatchQueue.main.async {
self.collectionView?.reloadData()
}
}
}
}
EDIT 2: Если я перемещаю код reloadData (включая DispatchQueue.main.async) за пределы дочернего элементаЗаявление, он работает хорошо с точки зрения отображения всех заметок, но тогда он не показывает имя пользователя и изображение профиля.Буквально не знаю, что здесь происходит.
РЕДАКТИРОВАТЬ 3: Все еще активно пытается решить эту проблему.Я не смог этого сделать, но я добавил оператор печати после каждого объявления в cellForItemAt, где я установил содержимое меток и текстовых представлений.Я надеялся, что это поможет мне выяснить, где проблема может быть найдена, но это не так, поскольку он возвращает следующее:
now working on cell: 0
username: Penny Wise
workout name: Test
note:
now working on cell: 1
username: Penny Wise
workout name: Test
note:
now working on cell: 2
workout name: Another Activity
note: Testing the basic functionality of the feed system
now working on cell: 3
username: Penny Wise
workout name: Activity
note: Nothing special. Just trying out a very long note here, to see if it wraps nicely inside the cell.
now working on cell: 4
username: Penny Wise
workout name: Testing this out!
note: Adding an optional note. Nothing interesting can be found here, but still.
now working on cell: 5
workout name: Some Random Activity
note: With a random note attached to it!
now working on cell: 0
username: Penny Wise
workout name: Test
note:
now working on cell: 1
username: Penny Wise
workout name: Test
note:
now working on cell: 2
username: Andrea Capella
workout name: Another Activity
note: Testing the basic functionality of the feed system
now working on cell: 3
username: Penny Wise
workout name: Activity
note: Nothing special. Just trying out a very long note here, to see if it wraps nicely inside the cell.
now working on cell: 4
username: Penny Wise
workout name: Testing this out!
note: Adding an optional note. Nothing interesting can be found here, but still.
now working on cell: 5
username: Andrea Capella
workout name: Some Random Activity
note: With a random note attached to it!
now working on cell: 0
username: Penny Wise
workout name: Test
note:
now working on cell: 1
username: Penny Wise
workout name: Test
note:
now working on cell: 2
username: Andrea Capella
workout name: Another Activity
note: Testing the basic functionality of the feed system
now working on cell: 3
username: Penny Wise
workout name: Activity
note: Nothing special. Just trying out a very long note here, to see if it wraps nicely inside the cell.
now working on cell: 4
username: Penny Wise
workout name: Testing this out!
note: Adding an optional note. Nothing interesting can be found here, but still.
now working on cell: 5
username: Andrea Capella
workout name: Some Random Activity
note: With a random note attached to it!
Он печатает все три раза.Это то, что я тоже не смог решить, но не моя самая большая проблема.Как видите, примечания отображаются в операторе печати, поэтому я не могу понять, почему они не устанавливаются в этих конкретных ячейках (с indexPath 4 и 5 в приведенном выше случае).Поэтому мне не хватает «Добавление дополнительной заметки. Ничего интересного здесь найти не удается, но все же».и "С прикрепленной к нему случайной запиской!"в моем приложении, как видно на скриншоте.Мне кажется, что что-то не так с тем, как я установил эту заметку, поэтому эта строка:
socialCell.noteTextView.text = posts[indexPath.item].postNote
Но я понятия не имею, что это может быть.Теперь я попытался добавить оператор if let, чтобы развернуть его, как я делал с другими значениями, но это тоже не сработало.