Сбой UICollectionView: ожидается возвращение представления, исключенного из очереди. Нужна помощь в устранении проблемы IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Сбой UICollectionView: ожидается возвращение представления, исключенного из очереди. Нужна помощь в устранении проблемы

Сообщение Anonymous »

Я сталкиваюсь с периодическим сбоем в моем приложении iOS с UICollectionView. Сообщение о сбое выглядит следующим образом:
Сообщение об ошибке:
Тема 1: «Ожидается, что выведенное из очереди представление будет возвращено в представление коллекции при подготовке к отображению. Когда источник данных представления коллекции запрашивается предоставление представления для заданного индексного пути, убедитесь, что одно представление исключено из очереди и возвращено в представление коллекции. Избегайте удаления представлений из очереди без запроса из представления коллекции. Для получения существующего представления в представлении коллекции используйте -[. UICollectionView cellForItemAtIndexPath:] или -[UICollectionView дополнительныйViewForElementKind:atIndexPath:].»
Предыстория и настройка:
Я работаю над проектом, который включает в себя UICollectionView, отображающий новости. Я использую собственный UICollectionViewCell (NewsCollectionViewCell) для представления каждого элемента. UICollectionView зарегистрирован правильно, и я использую стандартную реализацию для удаления из очереди и настройки ячеек.
Вот упрощенная версия моего кода:
Код: Настройка ячейки UICollectionView

Код: Выделить всё

class NewsCollectionViewCell: UICollectionViewCell {
static let reuseId = "NewsCollectionViewCell"

private let imageNews: UIImageView = { ... }()
private let dateNews: UILabel = { ... }()
private let nameNews: UILabel = { ... }()
private let descriptionNews: UILabel = { ... }()
private let readMoreLabel: UILabel = { ... }()

override init(frame: CGRect) {
super.init(frame: frame)
setupConstraints()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func prepareForReuse() {
super.prepareForReuse()
imageNews.image = nil
dateNews.text = ""
nameNews.text = ""
descriptionNews.text = ""
}

func fill(with news: News) {
// Populate the cell with data
}

private func setupConstraints() {
// SnapKit constraints for layout
}
}
Код: настройка представления коллекции и конфигурация ячеек

Код: Выделить всё

extension NewsViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return news.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: NewsCollectionViewCell.reuseId, for: indexPath) as? NewsCollectionViewCell else {
fatalError("Failed to dequeue NewsCollectionViewCell")
}

cell.fill(with: news[indexPath.item])
return cell
}
}
Что я пробовал на данный момент:
Проверен идентификатор повторного использования: идентификатор повторного использования для NewsCollectionViewCell установлен правильно и единообразен везде.
Зарегистрированный класс ячеек: ячейка регистрируется в setupCollectionView(), как показано ниже:

Код: Выделить всё

private func setupCollectionView() {
newsCollectionView.delegate = self
newsCollectionView.dataSource = self
newsCollectionView.register(NewsCollectionViewCell.self, forCellWithReuseIdentifier: NewsCollectionViewCell.reuseId)
}
Избегание повторного использования вручную: я убедился, что не управляю вручную и не храню ссылки на ячейки, исключенные из очереди.
prepareForReuse: реализована подготовкаForReuse в NewsCollectionViewCell для сброса всех свойств.
Проверено на разных устройствах и версиях iOS: проблема сохраняется на разных устройствах и симуляторах.
Проблема:
Сбой происходит непоследовательно, обычно при быстрой прокрутке представления коллекции или после нескольких перезагрузок. Сообщение об ошибке указывает на проблему с механизмом повторного использования ячеек. В частности, это предполагает, что удаляемая из очереди ячейка может быть возвращена неправильно или что одновременно может выполняться несколько действий по исключению из очереди.
Вопросы:
Почему ошибка все еще сохраняется, хотя я следую стандартному подходу удаления из очереди?
Может ли возникнуть проблема с моим пользовательским классом ячеек (NewsCollectionViewCell) или с тем, как он повторно используется?
Есть ли лучший способ справиться со сценарием, когда удаление из очереди завершается неудачно, вместо использования фатальной ошибки или создания нового экземпляра ячейки?
Возможно ли, что проблема возникает из-за использования SnapKit для верстки? Должен ли я переключиться на другой подход для установки ограничений?
У меня заканчиваются идеи о том, что может быть причиной этого сбоя. Любая помощь или предложения будут очень признательны!

Подробнее здесь: https://stackoverflow.com/questions/791 ... elp-fixing
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»