web-dev-qa-db-fra.com

cellForItemAtIndexPath non appelé, mais numberOfItemsInSection le fait

Cela pourrait être un post en double mais je n’ai trouvé la solution dans aucun de ceux-ci:

enter image description here

Je règle ma UICollectionView comme:

UINib *nib = [UINib nibWithNibName:@"CollectionViewCell"
                           bundle:[NSBundle mainBundle]];
[_collectionView registerNib: nib forCellWithReuseIdentifier:@"bCell"];

(J'ai essayé de définir délégué, sans délégué, etc.).

Mais alors, seuls les 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section est appelé alors que 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath not.

J'ai vérifié le numberOfItemsInSection I, et c'est toujours> 0 (c'est exactement 17).

J'ai vérifié pour appeler [_collectionView reloadData]; et rien ne se produit non plus.

J'ai essayé différentes choses mais je ne peux pas le faire fonctionner.

De plus, ma UICollectionView devrait être ici, mais ce n'est pas:

enter image description here

Est-ce que quelqu'un a un indice? Merci.

42
Rafael Ruiz Muñoz

Ok je pense que cela pourrait être utile pour les problèmes futurs avec ceci ...

C'était à cause des contraintes sur le StoryBoard. Je ne comprends pas vraiment pourquoi cela se produit, car je venais juste de fixer un espace horizontal. J'ai supprimé l'espace horizontal en tant que contrainte pour cette vue et tout fonctionne correctement.

Eh bien, laissez la vie couler.

33
Rafael Ruiz Muñoz

Je suis également confronté au même problème et je sais enfin que j'ai transmis un objet de classe incorrect pour collectionViewLayout, je passe à UICollectionViewFlowLayout au lieu de UICollectionViewLayout lors de la création d'un objet pour UICollectionView comme ci-dessous.

 collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())
15
Narayana

Ajoutez ceci à viewDidLoad:

self.automaticallyAdjustsScrollViewInsets = NO;
15
reza_khalafi

Je rencontre ce problème aussi. J'ai vérifié tous les problèmes possibles, tout semble aller pour le mieux. Ensuite, j'ai essayé de changer les méthodes de rechargement. 

[self.colView reloadData] -> [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]]; 

Ensuite, tout a fonctionné. Cependant, je ne comprends toujours pas comment.

12
frank

1. cellForItemAtIndexPath sera appelé lorsque vous renvoyez plus de 0 éléments sur la méthode numberOfItemsInSection.

2. Vérifiez que votre UICollectionViewFlowLayout est correct ou le vôtre. UICollectionViewLayout est une classe abstraite que vous ne pouvez pas utiliser directement

3. Vérifiez la taille de la cellule et de la vue Collection de la vue de collection.

4. Essayez de définir la taille de votre collectionview en code. [votreCollectionViewFlowLayout setItemSize: CGSizeMake (200, 200)];

5.Si l'un d'entre eux ne fonctionne PAS, alors tuez le XCode et redémarrez. Parfois, cela résoudra le problème.

Apple dit

La classe UICollectionViewLayout est une classe de base abstraite que vous sous-classez et utilisez pour générer des informations de présentation pour une vue de collection. Le travail d’un objet de modèle consiste à déterminer l’emplacement des cellules, des vues supplémentaires et des vues de décoration à l’intérieur des limites de la vue de collection et à rapporter ces informations à la vue de collection lorsque cela est demandé. La vue de collection applique ensuite les informations de disposition fournies aux vues correspondantes afin qu'elles puissent être présentées à l'écran.

Vous devez sous-classer UICollectionViewLayout pour pouvoir l'utiliser. Avant d’envisager un sous-classement, vous devez examiner la classe UICollectionViewFlowLayout pour voir si elle peut être adaptée à vos besoins de présentation.

Je viens de constater que NONE of cellForItemAtIndexPath est appelé (sous iOS 10) tant que au moins UNE cellule a une hauteur de zéro.

Disclaimer: désolé si cela aurait dû être un commentaire - pas assez de réputation.

6
KiRviz

Pour moi le cellForItemAtIndexPath n'est pas appelé pour la première fois après avoir défini la contrainte de la collectionView sur 0, puis de nouveau en le réglant à sa taille réelle.

 @IBOutlet weak var collectionVwHeightContraint: NSLayoutConstraint!
 if attachments.count > 0 {

     collectionVwHeightContraint.constant = 100
 }else {

     collectionVwHeightContraint.constant = 0
 }
 // collectionVwHeightContraint is my collectionView height Contraint outlet

J'ai résolu ceci en appelant:

self.view.layoutIfNeeded()

J'espère que ça va aider quelqu'un :)

2
Ariven Nadar

Ce qui m'a aidé, c'est de définir la bonne variable itemSize. Ma cellForItemAtIndexPath n'était pas appelée à cause d'une mauvaise hauteur.

Alors je mets la taille à:

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)];
1
Luiz Dias

Pour moi, le problème était que je créais ma vue de collection par programme, mais que je lui avais donné CGRectZero comme cadre. Je le disposais en utilisant Auto Layout après viewDidLoad. Si je dispose la vue de collection pendant le chargement du contrôleur de vue, il appelle correctement cellForItemAtIndexPath:.

1
Liron Yahdav

Pour moi, c'était que le conteneur de ma collectionView n'avait pas translatesAutoresizingMaskIntoConstraints = false

0
Jeremy Kelleher

J'ai eu le même problème avec la sortie de vue de collection sur un storyboard avec des contraintes "standard" (en bas, en haut, en tête, en queue fixée à la vue intérieure).

J'ai résolu de cette façon:

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.collectionView.frame.size
0
Luca Davanzo

J'avais rencontré un problème similaire. Le problème était avec le numberOfItems dans la section. Votre cellForRowAtIndexPath peut ne pas être appelé si votre nombre de sections ou le nombre de lignes de la section est inférieur à zéro.

0
iPhoneDeveloper