Ошибка: UICollectionView получил атрибуты макета для ячейки с индексным путем, который не существует в Swift - PullRequest
0 голосов
/ 13 ноября 2018

I «https://www.raywenderlich.com/392-uicollectionview-custom-layout-tutorial-pinterest" Чтобы создать пользовательский UICollectionView. (Для регулировки высоты ячейки)

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

Нет проблем при запуске приложения и первоначальном росте Cells. Однако при обновлении или изменении порядка количества ячеек всегда возникает ошибка.

ОШИБКА:

*** Ошибка подтверждения в - [UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore/UIKit-3698.93.8/UICollectionViewData.m:447

*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «UICollectionView получил атрибуты макета для ячейки с индексным путем, который не существует:

Таким образом, « Ошибка iOS 10: UICollectionView получил атрибуты макета для ячейки с индексным путем, который не существует » И попытался решить ошибку.

в строке ниже

self.artCollectionView.reloadData () 

Я пытался добавить

self.artCollectionView.collectionViewLayout.invalidateLayout () 

но это не было решено.

Кроме того, я не знаю, куда бежать

cache.removeAll ()

в разделе prepare (). (В PinterestLayout.swift есть функция prepare ())

Как правильно исправить ошибку?

Ответы [ 3 ]

0 голосов
/ 30 января 2019
extension UICollectionView{
   func refreshLayout() {
        let oldLayout = collectionViewLayout as! UICollectionViewFlowLayout
        let newLayout = UICollectionViewFlowLayout()
        newLayout.estimatedItemSize = oldLayout.estimatedItemSize
        newLayout.footerReferenceSize = oldLayout.footerReferenceSize
        newLayout.headerReferenceSize = oldLayout.headerReferenceSize
        newLayout.itemSize = oldLayout.itemSize
        newLayout.minimumInteritemSpacing = oldLayout.minimumInteritemSpacing
        newLayout.minimumLineSpacing = oldLayout.minimumLineSpacing
        newLayout.scrollDirection = oldLayout.scrollDirection
        newLayout.sectionFootersPinToVisibleBounds = oldLayout.sectionFootersPinToVisibleBounds
        newLayout.sectionHeadersPinToVisibleBounds = oldLayout.sectionHeadersPinToVisibleBounds
        newLayout.sectionInset = oldLayout.sectionInset
        newLayout.sectionInsetReference = oldLayout.sectionInsetReference
        collectionViewLayout = newLayout
    }
  }

Затем позвоните:

YourCollectionView.refreshLayout()
YourCollectionView.reloadData()

Счастливого кодирования!

0 голосов
/ 07 февраля 2019

Получила эту ошибку, когда я случайно установил высоту ячейки collectionView равной 0. Убедитесь, что высота (или любое измерение) больше 0! Чтобы убедиться, что значение всегда больше 0, я решил эту проблему.

0 голосов
/ 13 ноября 2018

В PinterestLayout.swift есть функция prepare, как и должно быть, потому что это единственный макет, используемый для настройки collectionView.

В строке 76 в PinterestLayout.swift файл.

Попробуйте

override public func prepare() {
    cache.removeAll()
    if cache.isEmpty {
       .....
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...