web-dev-qa-db-fra.com

Erreur: UICollectionView a reçu les attributs de mise en page pour une cellule avec un chemin d'index inexistant dans Swift.

I " https://www.raywenderlich.com/392-uicollectionview-custom-layout-tutorial-pinterest " Pour créer un UICollectionView personnalisé. (Pour ajuster la hauteur de la cellule)

Si je fais défiler vers le haut, la cellule continuera à être ajoutée, et défilez de haut en bas pour actualiser.

Il n'y a aucun problème lorsque vous exécutez votre application et que vous développez initialement Cells . Cependant, il y a toujours une erreur lors de l'actualisation ou de la réorganisation du nombre de cellules.

ERREUR :

*** Échec d'assertion dans - [UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.Apple.xbs/Sources/UIKitCore/UIKit-3698.93.8/UICollectionViewData.m.m44.

*** Arrêt de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'UICollectionView a reçu des attributs de mise en page pour une cellule avec un chemin d'index inexistant: 

Par conséquent, " Bug iOS 10: UICollectionView a reçu les attributs de mise en forme pour une cellule dont le chemin d’index n’existe pas " Et a tenté de résoudre l’erreur.

sur la ligne ci-dessous

self.artCollectionView.reloadData () 

J'ai essayé d'ajouter

self.artCollectionView.collectionViewLayout.invalidateLayout () 

mais ce n'était pas résolu.

Aussi, je ne sais pas où courir 

cache.removeAll ()

dans la section prepare () . (Il existe une fonction prepare () dans PinterestLayout.Swift)

Quelle est la bonne façon de résoudre l'erreur?

5
Enkha

Il y a une fonction prepare dans PinterestLayout.Swift comme il se doit, car c'est la seule disposition utilisée pour personnaliser la collectionView.

À la ligne 76, dans PinterestLayout.Swift file.

Essayer

override public func prepare() {
    cache.removeAll()
    if cache.isEmpty {
       .....
    }
}
4
Sateesh

J'ai reçu cette erreur lorsque je définissais accidentellement la hauteur d'une cellule de collectionView à 0. Assurez-vous que la hauteur (ou toute autre dimension) est supérieure à 0! S'assurer qu'il était toujours supérieur à 0 a résolu le problème pour moi.

1
Josh Wolff
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
    }
  }

Puis appelez:

YourCollectionView.refreshLayout()
YourCollectionView.reloadData()

Bon codage!

1
onkar dhanlobhe