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

15voto

GSK Points 1322

Si votre classe est une sous-classe de UICollectionviewController et que vous créez le collectionView de manière programmatique, utilisez alors

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .Vertical
    layout.itemSize = CGSizeMake(50, 50)

    collectionView?.setCollectionViewLayout(layout, animated: false)

10voto

R-Aamir Points 3525

J'utilisais autolayout, et dans mon cas la contrainte de hauteur était manquante

6voto

Dean Points 1

Dans mon cas, ce que j'avais stupidement oublié de faire, c'était d'implémenter la fonction UICollectionViewDataSource méthode de protocole numberOfItemsInSection Il s'agit donc d'un autre élément à vérifier.

6voto

nebyark Points 101

Mon problème était que j'avais deux vues de collection dans la même vue, et que les deux partageaient une vue calculée. UICollectionViewFlowLayout instance. Une fois que j'ai créé des instances distinctes du même schéma de débit, tout s'est bien passé.

6voto

Wouter Points 592

J'avais un problème similaire. Mais à la place 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é plusieurs des solutions proposées ici et, comme beaucoup d'autres, j'ai trouvé que cela avait à voir avec la taille des éléments. Pour moi, la solution consistait à modifier la taille estimée de l'élément UICollectionView de Automatique a Personnalisé .

Set estimate size to Custom

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