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é ?

148voto

IkegawaTaro Points 589

Pour ceux qui trébuchent ici, plus tard.... la raison :

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

n'a pas été appelé parce que la taille de l'itemSize pour la hauteur du collectionViewFlowLayout était trop grande.

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];

Si je modifie la hauteur à 410, il exécutera cellForItemAtIndexPath.

111voto

esilver Points 7768

Dans mon cas, c'est parce que ma classe de mise en page a été incorrectement sous-classée à partir de UICollectionViewLayout au lieu de UICollectionViewFlowLayout

36voto

Deepak G M Points 430

La fonction cellForItemAtIndexPath ne sera pas appelée si vous ne fournissez pas d'informations sur la taille du contenu à la vue de la collection.

  1. Si vous utilisez la mise en page Flow : Vous devez définir correctement les tailles des articles.
  2. Si vous disposez d'une disposition personnalisée sous-classée de UICollectionViewLayout : Assurez-vous que vous renvoyez une taille appropriée à partir de la méthode collectionViewContentSize.

Dans le cas de ce dernier, vous observerez également que votre layoutAttributesForElementsRect n'est pas non plus appelé. La raison en est que vous n'avez pas spécifié la taille de votre contenu et que, par défaut, la taille sera CGSizeZero. Cela indique essentiellement à la vue de la collection que vous n'avez pas de contenu à peindre et qu'elle ne prend pas la peine de vous demander des attributs ou des cellules.

Ainsi, il suffit de surcharger collectionViewContentSize et de fournir une taille appropriée, ce qui devrait résoudre votre problème.

18voto

wangjiebo Points 126

Pour une hiérarchie de vues plus compliquée, veuillez consulter ceci blog . Il m'a sauvé la vie !

self.automaticallyAdjustsScrollViewInsets = NO;

16voto

Anthony Castelli Points 164

Peut-être que je ne vois pas, mais il semble qu'il vous manque votre délégué et votre source de données. Dans votre fichier d'en-tête, assurez-vous que vous avez ajouté ces éléments :

<UICollectionViewDelegate, UICollectionViewDataSource>

et dans votre méthode viewDidLoad, ajoutez ceci :

self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;

En outre, si vous le chargez via un fichier .xib, vérifiez que vous avez connecté l'IBOutlet à l'UICollectionView.

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