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

2voto

Eran Goldin Points 745

Assurez-vous que numberOfSectionsInCollectionView renvoie également un nombre entier positif.

Il doit y avoir au moins une section dans la collection.

2voto

RT Denver Points 51

Assurez-vous que -(NSInteger) collectionView:numberOfItemsInSection : renvoie une valeur positive (c'est-à-dire supérieure à zéro). Il peut s'agir de placer [self.collectionView reloadData] ; dans le gestionnaire d'achèvement.

2voto

inokey Points 1180

Lorsque vous utilisez UICollectionViewDelegateFlowLayout faites attention à ce que cette fonction renvoie. Le site width y height doit être supérieure à 0 . J'ai utilisé window comme référence de cadre, mais en raison de la complexité de la hiérarchie des vues, la fenêtre était nil au moment de l'exécution. Si vous devez ajuster la largeur de l'élément en fonction de la largeur de l'écran, utilisez la fonction UIScreen.main.bounds .

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
           UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}

2voto

erdikanik Points 474

Il peut être réalisé des problèmes de mise en page. Vérifiez les avertissements de mise en page dans la console, s'ils existent.

2voto

khaled annajar Points 945

Dans mon cas, la vue de la collection n'était pas entièrement visible dans sa vue parent en raison de contraintes de mise en page automatique incorrectes. En corrigeant les contraintes, la vue de la collection est devenue entièrement visible et cellForItemAtIndexPath a été appelé.

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