UICollectionView échec d'Assertion
Je m d'erreur sur l'exécution de insertItemsAtIndexPaths
dans UICollectionView
Échec d'Assertion dans:
-[UICollectionViewData indexPathForItemAtGlobalIndex:],
/SourceCache/UIKit/UIKit-2372/UICollectionViewData.m:442
2012-09-26 18:12:34.432
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'request for index path for global index 805306367
when there are only 1 items in the collection view'
J'ai vérifié et ma source de données ne contient qu'un seul élément.
Pourquoi cela pourrait se produire? Si plus d'information est nécessaire, je peux leur fournir.
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré ce même problème lors de l'insertion de la première cellule en vue d'une collection. J'ai résolu le problème en modifiant mon code de façon à ce que j'appelle de la UICollectionView
méthode lors de l'insertion de la première cellule, mais
lors de l'insertion de toutes les autres cellules.
Fait intéressant, j'ai aussi eu un problème avec
lors de la suppression de la dernière cellule. J'ai fait la même chose qu'avant: il suffit d'appeler
reloadData
lors de la suppression de la dernière cellule.reloadData
en dehors et avant laperformBatchUpdates:
bloc, l'INTERFACE utilisateur, des mises à jour désiré et le crash s'en va.De l'insertion de l'article#0 juste avant l'insertion de cellules semble faire UICollectionView heureux.
numberOfSectionsInCollectionView:
méthode. Return 0 articles si votre collection est vide, et retourne 1 si la collection n'est pas. Si vous n'êtes pas la mise en œuvre de cette méthode ou de retour de 0, vous obtiendrez des erreurs de mise à jour " des erreurs se plaindre du nombre de sections de ne pas être juste après que vous ne l'insérez.J'ai posté un travail autour de ce problème ici: https://gist.github.com/iwasrobbed/5528897
Dans le privé, de la catégorie en haut de votre
.m
fichier:Alors votre délégué rappels serait:
De crédit pour cette approche va à Blake Watters.
NSFetchedResultsChangeInsert
doit vérifier le nombre d'éléments dans la section*new*IndexPath.section
, cependant.Ici est un non-hack, docs de réponse au problème. Dans mon cas, il y avait une condition selon laquelle je serais de retour valide ou un néant complémentaire en vue de
collectionView:viewForSupplementaryElementOfKind:atIndexPath:
. Après avoir rencontré le crash, j'ai vérifié les docs et voici ce qu'ils disent:Il y a d'autres façons de le faire, mais le moyen le plus rapide semble être:
Ma collection vue a été d'obtenir des éléments de deux sources de données et les mettre à jour la cause de ce problème. Ma solution a été de file d'attente de la mise à jour des données et la collecte de vue recharger ensemble:
Vérifier que vous êtes de retour le bon nombre d'éléments dans le
UICollectionViewDataSource
méthodes:et
Je suis tombé sur ce problème. Voici ce qui m'est arrivé:
initWithCollectionViewLayout:
, a été l'initialisation de monNSFetchedResultsController
.NSManagedObjects
, les ajouter à monNSManagedObjectContext
, qui a le thread principal de l'NSManagedObjectContext
comme unparentContext
.NSFetchedResultsController
chercher les modifications et file.- (void)controllerDidChangeContent:
, je voudrais processus de changements et de les appliquer à monUICollectionView
.Par intermittence, je reçois le message d'erreur que l'OP est arriver et je ne pouvais pas comprendre pourquoi.
Pour résoudre ce problème, j'ai déplacé les
NSFetchedResultsController
d'initialisation et deperformFetch
à mon- viewDidLoad
méthode et ce problème est maintenant disparu. Pas besoin d'appeler[collectionView reloadData]
ou quoi que ce soit et toutes les animations sont travail correctement.Espérons que cette aide!
Il semble que le problème se produit lorsque vous insérez ou que vous déplacer d'une cellule à une section qui contient un supplément d'en-tête ou le pied de page vue (avec
UICollectionViewFlowLayout
ou un modèle dérivé de celui de la) et de la section dispose d'un nombre de 0 cellules avant l'insertion /déplacer.Je ne pouvais contourner le crash, et toujours maintenir les animations par la présence d'un vide et invisible de la cellule dans la section contenant la complémentaire vue d'en-tête comme ceci:
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
retour de la réelle de la cellule `count + 1 pour la section où la vue d'en-tête est.Dans
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
retour... une cellule vide pour le poste. N'oubliez pas de vous inscrire à la cellule de réutilisation dans
viewDidLoad
ou partout où vous initialisez votre UICollectionView:moveItemAtIndexPath:
ouinsertItemsAtIndexPaths:
sans s'écraser.Voici une solution pour ce bug que j'ai utilisé dans mes projets, je pensais que je poste ici au cas où tout trouvé de précieux.
Dans mon cas, le problème était la façon dont j'ai été la création de mon
NSIndexPath
. Par exemple, pour supprimer la 3ème cellule, au lieu de faire :Je devais faire :
Vérifier que vous êtes de retour la valeur correcte dans
numberOfSectionsInCollectionView:
La valeur que j'ai été en utilisant pour calculer les sections a été nulle, donc
0
sections. Cela a provoqué l'exception.Juste pour le record, je suis tombé sur le même problème, et pour moi la solution a été de supprimer l'en-tête (désactiver dans le .xib) et comme elles n'étaient plus nécessaires retiré de cette méthode. Après que tout semble aller bien.
J'ai frappé ce problème moi-même. Ici toutes les réponses semblaient poser de problèmes, sauf pour Alex L est. Se référant à la mise à jour semble être tha réponse. Voici ma solution finale:
La solution de contournement qui fonctionne réellement est de retour d'une hauteur de 0 si la cellule à votre complémentaire en vue de l'indice du chemin d'accès n'est pas là (chargement initial, vous avez supprimé la ligne, etc). Voir ma réponse ici:
https://stackoverflow.com/a/18411860/917104