Ce n'est que ma deuxième fois que j'utilise UICollectionView et j'ai peut-être mordu plus que je ne peux mâcher, mais néanmoins:
J'implémente un UICollectionView (myCollectionView) qui utilise des UICollectionViewCell personnalisés que j'ai sous-classés. Les cellules sous-classées (FullReceiptCell) contiennent UITableView et ont la taille du viewcontroller. J'essaye de permettre le défilement horizontal entre les FullReceiptCells.
Le UICollectionViewController sous-classé qui contient myCollectionView est poussé sur une pile de contrôleurs de navigation. Actuellement, myCollectionView loas et le défilement horizontal sont activés. Cependant, aucune cellule n'est visible. J'ai confirmé que
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
a exécuté et renvoie un entier supérieur à 0. J'ai également confirmé que le délégué et la source de données de myCollectionView sont correctement définis dans IB pour le UICollectionViewController sous-classé.
La méthode dans laquelle les cellules doivent être chargées:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
n'est pas appelé.
Voici où je pousse UICollectionViewController et ma méthode viewDidLoad dans ce contrôleur (REMARQUE: initWithBill est un remplacement de l'initialiseur normal):
Dans le fichier .m ViewControllers précédent:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
Dans FullReceiptViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
self.myCollectionView.pagingEnabled = YES;
// Setup flowlayout
self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
[self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
[self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
//testing to see if the collection view is loading
self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
Un indice quant à la raison pour laquelle il n'est pas appelé?
la source
Réponses:
Pour ceux qui trébucheront ici plus tard ... la raison:
n'a pas été appelé parce que la hauteur de itemSize de la collectionViewFlowLayout était trop grande.
Si je change la hauteur à 410, il exécutera cellForItemAtIndexPath.
la source
Adjust Scroll View Insets
votre ViewController sur Storyboard.Dans mon cas, c'était parce que ma classe de mise en page était incorrectement sous-classée de
UICollectionViewLayout
au lieu deUICollectionViewFlowLayout
la source
Le cellForItemAtIndexPath ne sera pas appelé si vous ne fournissez pas les informations de taille de contenu à la vue de collection.
Dans ce dernier cas, vous remarquerez également que votre layoutAttributesForElementsRect n'est pas non plus appelé. La raison est que vous n'avez pas spécifié la taille de votre contenu et par défaut, la taille sera CGSizeZero. Cela indique essentiellement à la vue de la collection que vous n'avez aucun contenu à peindre, donc cela ne prend pas la peine de vous demander des attributs ou des cellules.
Donc, remplacez simplement collectionViewContentSize et fournissez une taille appropriée, cela devrait résoudre votre problème.
la source
collectionViewContentSize
0 renvoyé par erreur pour la largeur, c'est pourquoi lecellForItemAtIndexPath
n'a pas été appelé.Peut-être que je l'ignore, mais il semble que votre délégué et votre source de données vous manquent. Dans votre fichier d'en-tête, assurez-vous d'avoir ajouté ces éléments:
et dans votre méthode viewDidLoad, ajoutez ceci:
De plus, si vous le chargez via un .xib, assurez-vous que vous avez connecté l'IBOutlet à UICollectionView.
la source
Pour une hiérarchie des vues plus compliquée, veuillez consulter ce blog . Cela m'a sauvé la vie!
la source
Si votre classe est une sous-classe de UICollectionviewController et que vous créez collectionView par programme, utilisez
la source
J'utilisais la mise en page automatique et dans mon cas, la contrainte de hauteur était manquante
la source
Mon problème était que j'avais 2 vues de collection dans la même vue, et les deux partageaient une
UICollectionViewFlowLayout
instance calculée . Une fois que j'ai créé des instances séparées de la même disposition de flux, cela a bien fonctionné.la source
Dans mon cas, ce que j'avais bêtement oublié de faire était d'implémenter la
UICollectionViewDataSource
méthode du protocolenumberOfItemsInSection
, donc c'est une autre chose à vérifier.la source
Assurez-vous également que reloadData n'est pas appelé pendant la mise à jour de la vue de collection avec une animation (insérer, supprimer, mettre à jour ou effectuerBatchUpdates).
la source
Dans mon cas, set a
collectionView.prefetchingEnabled = NO;
résolu mon problème. Fonctionne uniquement sur iOS 10.la source
Cela se passait pour moi lorsque la hauteur de l'élément == 0 en corrigeant cette méthode cellForItem a été appelée.
la source
Il y a dix minutes, j'ai également rencontré ce problème, j'ai fait une erreur stupide.
Mon intention est d'utiliser UICollectionViewFlowLayout,
Mais à cause d'erreurs, j'ai utilisé UICollectionViewLayout.
la source
Dans mon cas, changer le translucide de UINavigationBar en NO a résolu le problème.
la source
Dans Xcode 7.0.1, nous avons eu ce problème lorsque nous avons copié un storyboard et le code associé d'un autre projet. La vue de collection avait une disposition de flux personnalisée définie dans le storyboard. La solution était de:
Maintenant ça a marché :)
la source
Assurez-vous que
numberOfSectionsInCollectionView
renvoie également un entier positif.Il doit y avoir au moins une section dans la collection.
la source
Assurez-vous que - (NSInteger) collectionView: numberOfItemsInSection: renvoie une valeur positive (lecture, supérieure à zéro). Il peut s'agir de placer [self.collectionView reloadData]; dans le gestionnaire de complétion.
la source
J'ai oublié de définir le masque de redimensionnement automatique sur false dans la vue de collection:
la source
Il peut s'agir de problèmes de mise en page réalisés. Vérifiez les avertissements de mise en page de la console, le cas échéant.
la source
Dans mon cas, la vue de collection n'était pas entièrement visible dans sa vue parente en raison de mauvaises contraintes de mise en page automatique. Ainsi, la correction des contraintes rendait la vue de la collection entièrement visible et cellForItemAtIndexPath a été appelé.
la source
Dans le storyboard / xib UICollectionView, la propriété cellSize DOIT ne pas être {0, 0}
la source
Si vous utilisez des protocoles de vue de collection, vous devez connecter les protocoles
CollectionViewDataSource
etCollectionViewDelegate
à votre ViewController.la source
La même chose m'est arrivée. J'avais 2 UICollectionViews et j'ai supprimé une fois car je n'en avais pas besoin. Après cela, j'ai réalisé que le CellForItemAtIndexPath n'était pas appelé mais les autres méthodes requises. J'ai essayé tout ce qui précède mais j'ai ensuite fait la magie standard. Suppression de la vue de collection du storyboard et ajout à nouveau. Ensuite, cela a commencé à fonctionner. Je ne sais pas pourquoi et je n'ai aucune explication, mais peut-être des problèmes de connexion.
la source
Je viens de résoudre ce problème, pour une situation un peu spécifique.
Dans mon cas, j'initialisais manuellement l'UICollectionViewController dans un ViewController parent, puis j'ajoutais la vue UICollectionViewController en tant que sous-vue.
J'ai résolu le problème en appelant 'setNeedsLayout' et / ou 'setNeedsDisplay' sur la collectionView dans le viewDidAppear du parent:
la source
Lorsque vous utilisez,
UICollectionViewDelegateFlowLayout
faites attention à ce que cette fonction renvoie. Les deuxwidth
etheight
doivent être supérieurs à0
. J'ai utiliséwindow
comme référence de cadre, mais en raison de la complexité de la fenêtre de hiérarchie des vues, c'étaitnil
au moment de l'exécution. Si vous avez besoin d'ajuster la largeur de l'élément en fonction de l'utilisation de la largeur de l'écranUIScreen.main.bounds
.la source
Dans mon cas, j'ai eu le
collectionView
dans unUIStackView
avecalignment = .center
. Donc, lecollectionView
n'avait pas de largeur. Lors de la misestackView.alignment
à.fill
tout allait bien.la source
Pour moi, je mets à jour la hauteur de self.view (le superview de collectionView) via la mise en page automatique, et DOIT appeler
layoutIfNeeded
après cela.la source
Dans mon cas, j'ai dû ajuster la taille estimée du contenu. la taille du contenu ne l'a pas fait.
la source
J'avais un problème similaire. Mais à la place, il
cellForItemAtIndexPath
était appelé lorsque le nombre d'éléments était> 1, mais pas lorsqu'il n'y avait qu'un seul élément. J'ai essayé de nombreuses solutions proposées ici et, comme beaucoup d'autres, j'ai trouvé que cela avait à voir avec le dimensionnement des articles. Pour moi, la solution était de changer la taille estimée de laUICollectionView
de Automatique à Personnalisée .la source
J'ai perdu un peu de temps avec ce problème à venir avec un CollectionView dans un contrôleur de vue contenue chargé à partir d'un storyboard. J'ai fini par simplement supprimer le contrôleur de vue contenu et le recréer dans le storyboard, ce qui a semblé résoudre le problème. Je suppose qu'il y avait une sorte de corruption de storyboard qui avait eu lieu.
la source