No se llama a cellForItemAtIndexPath de UICollectionView

Solo la segunda vez que usé UICollectionView y quizás he mordido más de lo que puedo masticar pero, sin embargo:

Estoy implementando un UICollectionView (myCollectionView) que utiliza UICollectionViewCell personalizado que he subclasificado. Las celdas subclasificadas (FullReceiptCell) contienen UITableView's y tienen el tamaño del viewcontroller. Estoy tratando de permitir el desplazamiento horizontal entre las FullReceiptCells.

El subclasificado UICollectionViewController que contiene myCollectionView se está ejecutando en una stack de controlleres de navigation. Actualmente, myCollectionView loas y el desplazamiento horizontal están habilitados. Sin embargo, no hay celdas visibles. He confirmado eso

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

ha ejecutado y está devolviendo un integer mayor que 0. También he confirmado que el delegado y el origen de datos de myCollectionView están correctamente configurados en IB para el subclasificado UICollectionViewController.

El método donde se deben cargar las celdas:

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

No se llama.

Aquí es donde presiono el UICollectionViewController y mi método viewDidLoad dentro de ese controller (NOTA: initWithBill es una anulación del inicializador normal):

En el file Viewmtrollers .m anterior:

 FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill]; test.title = @"Review"; [self.navigationController pushViewController:test animated:YES]; 

En 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]; 

¿Alguna pista sobre por qué no se llama?

Para aquellos que tropiezan aquí más tarde … la razón:

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

no se llamaba porque era el elemento size para la colección. La altura de ViewFlowLayout era demasiado grande.

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

Si cambio la altura a 410, ejecutará cellForItemAtIndexPath.

En mi caso, fue porque mi class de layout se UICollectionViewLayout incorrectamente desde UICollectionViewLayout lugar de UICollectionViewFlowLayout

El cellForItemAtIndexPath no se llamará si no proporciona la información de tamaño de contenido a la vista de recostackción.

  1. Si está utilizando el layout de flujo : debe establecer correctamente los tamaños de los elementos.
  2. Si tiene un layout personalizado subclass de UICollectionViewLayout : Asegúrese de devolver un tamaño apropiado del método collectionViewContentSize.

En el caso de este último, también observará que su layoutAttributesForElementsRect tampoco se llama. La razón es que no ha especificado cuál es su tamaño de contenido y, por defecto, el tamaño será CGSizeZero. Esto básicamente indica a la vista de colección que no tiene ningún contenido para pintar, por lo que no se molesta en pedirle attributes o celdas.

Por lo tanto, solo anule collectionViewContentSize y proporcione un tamaño adecuado allí, debería resolver su problema.

Quizás lo estoy pasando por alto, pero parece que le faltan su delegado y su fuente de datos. En su file de encabezado, asegúrese de haber agregado estos:

 <UICollectionViewDelegate, UICollectionViewDataSource> 

y en su método viewDidLoad agrega esto:

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

Además, si lo está cargando a través de un .xib, asegúrese de haber conectado el IBOutlet a UICollectionView.

Para una jerarquía de vista más complicada, consulte este blog . ¡Me salvó la vida!

 self.automaticallyAdjustsScrollViewInsets = NO; 

En mi caso, lo que había olvidado de manera estúpida era implementar el método de protocolo UICollectionViewDataSource numberOfItemsInSection , por lo que es otra cosa que verificar.

En mi caso, cambiar el translúcido de UINavigation Bar a NO resolvió el problema.

Me estaba sucediendo cuando la altura del elemento == 0 mediante la fijación del método cellForItem se llamó.

Asegúrese de: (NSInteger) collectionView: numberOfItemsInSection: devuelve un valor positivo (leer, mayor que cero). Puede ser una cuestión de colocar [self.collectionView reloadData]; en el controller de finalización.

Hace diez minutos también encontré este problema, cometí un error tonto.

Mi intención es usar UICollectionViewFlowLayout,

Pero debido a errores, utilicé UICollectionViewLayout.

En Xcode 7.0.1, tuvimos este problema cuando copymos un guión gráfico y un código acompañante de otro proyecto. La vista de colección tenía un layout de flujo personalizado establecido en el guión gráfico. La solución fue:

  • Eliminar el layout de flujo en IB
  • Comstackr / ejecutar la aplicación
  • Establezca la distribución de flujo

Ahora funcionó 🙂

Si su class es la subclass UICollectionviewController y está creando collectionView mediante progtwigción el uso

 let layout = UICollectionViewFlowLayout() layout.scrollDirection = .Vertical layout.itemSize = CGSizeMake(50, 50) collectionView?.setCollectionViewLayout(layout, animated: false) 

Lo mismo me pasó a mí. Tuve 2 UICollectionViews y quité una vez porque no necesitaba eso. Después de eso, me di count de que CellForItemAtIndexPath no recibía llamadas pero los otros methods requeridos. Probé todo lo anterior, pero luego hice la magia estándar. Se eliminó la vista de colección del guión gráfico y se agregó de nuevo. Luego comenzó a funcionar. No estoy seguro de por qué y no tengo ninguna explicación pero tal vez algunos problemas de connection.

Asegúrese de que numberOfSectionsInCollectionView devuelve un número integer positivo también.

Tiene que haber al less una sección en la colección.

Olvidé configurar la máscara de autorrealización en falso en la vista de colección:

 collectionView.translatesAutoresizingMaskIntoConstraints = false 

Si está utilizando protocolos de vista de colección, debe conectar los protocolos CollectionViewDataSource y CollectionViewDataSource a su ViewController. Exportadores de interfaces de interfaz

Tuve el mismo problema. Después de probar durante varias horas con varias técnicas, lo que funcionó para mí fue: reiniciar Xcode. Se llamó a mi cellforitematindexpath y se llenaron las celdas con las imágenes correctamente

Me quité un poco de time con este problema que viene con un CollectionView en un controller de vista contenido cargado desde un storyboard. Terminé simplemente borrando el controller de vista contenido, y lo volví a crear en el guión gráfico, y esto pareció eliminar el problema. Supongo que hubo algún tipo de corrupción de guiones charts que se había producido.

Además, asegúrese de que no se llame a reloadData mientras la vista de colección se actualiza con animation (insert, eliminar, actualizar o realizarBatchUpdates).

En mi caso, establezca collectionView.prefetchingEnabled = NO; resuelto mi problema Solo funciona en iOS 10.

Para mí, actualizo la altura de self.view (la vista de supervisión de collectionView) a través de autolayout, y DEBO llamar a layoutIfNeeded después de eso.

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

Acabo de resolver este problema, para una situación algo específica.

En mi caso, estaba inicializando manualmente el UICollectionViewController en un ViewController primario, y luego agregando la vista UICollectionViewController como una subvista.

Resolví el problema llamando a 'setNeedsLayout' y / o 'setNeedsDisplay' en la colecciónView en la vista principalDidAppear:

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

Mi problema fue que tenía 2 vistas de colección dentro de la misma vista, y ambas compartían una instancia calculada de UICollectionViewFlowLayout . Una vez que creé instancias separadas del mismo layout de flujo, funcionó bien.

Configurar el frame de la colecciónView dentro del layout de la celda personalizadaSubViews () trabajado para mí:

 override func layoutSubviews() { super.layoutSubviews() let frame = self.contentView.bounds self.CollectionView.frame = frame }