119 votes

La fonction cellForItemAtIndexPath de UICollectionView n'est pas appelée.

Ce n'est que la deuxième fois que j'utilise les UICollectionView et j'ai peut-être eu les yeux plus gros que le ventre, mais il n'empêche :

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 des UITableView et ont la taille du viewcontroller. J'essaie de permettre le défilement horizontal entre les FullReceiptCell.

Le UICollectionViewController sous-classé qui contient myCollectionView est poussé sur une pile de contrôleurs de navigation. Actuellement, le myCollectionView est visible et le défilement horizontal est activé. Cependant, aucune cellule n'est visible. J'ai confirmé que

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

a été exécuté et renvoie un nombre 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 contrôleur UICollectionView sous-classé.

La méthode où les cellules doivent être chargées :

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

n'est pas appelé.

C'est ici que je pousse le UICollectionViewController et ma méthode viewDidLoad dans ce contrôleur (NOTE : initWithBill est une surcharge de l'initialisateur normal) :

Dans le fichier ViewControllers .m 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];

Avez-vous une idée de la raison pour laquelle il n'est pas appelé ?

1voto

Hafeez Points 16

La même chose m'est arrivée. J'avais 2 UICollectionViews et j'en ai supprimé un car je n'en avais pas besoin. Après cela, j'ai réalisé que la méthode CellForItemAtIndexPath n'était pas appelée mais les autres méthodes requises. J'ai essayé tout ce qui précède, puis j'ai fait la magie standard. J'ai supprimé la vue de la collection du storyboard et je l'ai rajoutée. Et là, ça a commencé à fonctionner. Je ne sais pas pourquoi et je n'ai pas d'explication, mais peut-être des problèmes de connexion.

1voto

iwill Points 845

Dans mon cas, je mets à jour la hauteur de self.view (la vue supérieure du collectionView) via autolayout, et je DOIS appeler layoutIfNeeded après cela.

[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];

1voto

Tim Lenardo Points 41

Je viens de résoudre ce problème, pour une situation un peu particulière.

Dans mon cas, j'initialisais manuellement le UICollectionViewController dans un ViewController parent, puis j'ajoutais la vue du UICollectionViewController en tant que sous-vue.

J'ai résolu le problème en appelant 'setNeedsLayout' et/ou 'setNeedsDisplay' sur le collectionView dans le viewDidAppear du parent :

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [_collection.view setNeedsLayout];
   [_collection.view setNeedsDisplay];
}

0voto

user3565741 Points 11

J'ai eu le même problème. Après avoir essayé pendant quelques heures avec différentes techniques, ce qui a fonctionné pour moi a été de redémarrer Xcode. Mon cellforitematindexpath a été appelé et les cellules ont été remplies avec les images correctement.

0voto

tobi Points 1

Dans mon cas, j'ai dû ajuster la taille estimée du contenu. La taille du contenu n'a pas fonctionné.

  let layout = collectionVC.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: 100, height: 100)
    layout.estimatedItemSize = CGSize(width: 100, height: 100)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X