ios - No se llama a cellForItemAtIndexPath de UICollectionView
objective-c (28)
Acabo de resolver este problema, para una situación algo específica.
En mi caso, estaba inicializando manualmente el UICollectionViewController en un ViewController padre, y luego agregué la vista de UICollectionViewController como una subvista.
Resolví el problema llamando a ''setNeedsLayout'' y / o ''setNeedsDisplay'' en el collectionView en el viewDidAppear del padre:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[_collection.view setNeedsLayout];
[_collection.view setNeedsDisplay];
}
Es la segunda vez que uso UICollectionView''s y tal vez he mordido más de lo que puedo masticar, pero sin embargo:
Estoy implementando un UICollectionView (myCollectionView) que usa UICollectionViewCell personalizado que he subclasificado. Las celdas subclase (FullReceiptCell) contienen UITableView y son del tamaño del viewcontroller. Estoy tratando de permitir el desplazamiento horizontal entre FullReceiptCells.
El UICollectionViewController subclasificado que contiene myCollectionView se está presionando en una pila de controlador de navegación. Actualmente, myCollectionView loas y desplazamiento horizontal están habilitados. Sin embargo, no hay celdas visibles. He confirmado eso
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
ha ejecutado y devuelve un entero mayor que 0. También he confirmado que el delegado y el origen de datos de myCollectionView están configurados correctamente en IB para el UICollectionViewController subclasificado.
El método donde se cargarán las celdas:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
no está siendo llamado.
Aquí es donde presiono el UICollectionViewController y mi método viewDidLoad dentro de ese controlador (NOTA: initWithBill es una anulación del inicializador normal):
En el anterior archivo ViewControllers .m:
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 de por qué no se llama?
Además, asegúrese de que no se invoque reloadData mientras la vista de colección se esté actualizando con la animación (insertar, eliminar, actualizar o ejecutar MakeUpUpdate).
Al usar UICollectionViewDelegateFlowLayout
tenga cuidado con lo que devuelve esta función. Tanto el width
como la height
deben ser mayores que 0
. Utilicé la window
como referencia de marco, pero debido a la complicada ventana de jerarquía de vista era nil
en el tiempo de ejecución. Si necesita ajustar el ancho del elemento en función del ancho de la pantalla, use UIScreen.main.bounds
.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout:
UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}
Asegúrese de que - (NSInteger) collectionView: numberOfItemsInSection: devuelve un valor positivo (lectura, mayor que cero). Puede ser una cuestión de colocar [self.collectionView reloadData]; en el controlador de finalización.
Asegúrese de que numberOfSectionsInCollectionView
devuelva un número entero positivo.
Tiene que haber al menos una sección en la colección.
En Xcode 7.0.1, obtuvimos este problema cuando copiamos un guión gráfico y un código adjunto de otro proyecto. La vista de colección tenía un diseño de flujo personalizado establecido en el guión gráfico. La solución fue:
- Eliminar el diseño de flujo en IB
- Compila / ejecuta la aplicación
- Establecer el diseño de flujo de vuelta
Ahora funcionó :)
En mi caso, cambiar el translúcido de UINavigationBar a NO resolvió el problema.
En mi caso, configure collectionView.prefetchingEnabled = NO;
resolvió mi problema Solo funciona en iOS 10.
En mi caso, fue porque mi clase de diseño subclassed incorrectamente de UICollectionViewLayout
lugar de UICollectionViewFlowLayout
En mi caso, la vista de colección no era completamente visible en su vista principal debido a restricciones de diseño automático incorrectas. Así que la fijación de las restricciones hizo que la vista de colección fuera visible y se invocó cellForItemAtIndexPath.
En mi caso, lo que olvidé estúpidamente de hacer fue implementar el método de protocolo UICollectionViewDataSource
numberOfItemsInSection
, así que eso es otra cosa que UICollectionViewDataSource
verificar.
Estaba usando autolayout, y en mi caso faltaba la restricción de altura
Establecer el marco de collectionView dentro del diseño de la celda personalizadaSubViews () funcionó para mí:
override func layoutSubviews() {
super.layoutSubviews()
let frame = self.contentView.bounds
self.CollectionView.frame = frame
}
Hace diez minutos también me encontré con este problema, cometí un error tonto.
Mi intención es usar UICollectionViewFlowLayout,
Pero debido a errores, utilicé UICollectionViewLayout.
Lo mismo me pasó a mí. Tuve 2 UICollectionViews y lo eliminé una vez porque no lo necesitaba. Después de eso, me di cuenta de que CellForItemAtIndexPath no se llamaba, pero los otros métodos requeridos. Intenté todo lo anterior pero luego hice la magia estándar. Se eliminó la vista de colección del guión gráfico y se volvió a agregar. Entonces comenzó a funcionar. No estoy seguro de por qué y no tengo ninguna explicación, pero tal vez algunos problemas de conexión.
Me estaba sucediendo cuando la altura del artículo == 0 solucionando que se llamara el método cellForItem.
Me hundí un poco de tiempo con este problema que viene con un CollectionView en un controlador de vista contenida cargado desde un guión gráfico. Terminé simplemente borrando el controlador de vista contenido, y recreándolo en el guión gráfico, y esto pareció eliminar el problema. Creo que hubo algún tipo de corrupción en el guión gráfico que tuvo lugar.
Mi problema era 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 diseño de flujo, funcionó bien.
No se llamará a cellForItemAtIndexPath si no proporciona la información de tamaño de contenido a la vista de colección.
- Si está utilizando el diseño de flujo : debe establecer los tamaños de los elementos correctamente.
- Si tiene un diseño personalizado subclasificado desde UICollectionViewLayout : Asegúrese de devolver un tamaño adecuado desde el 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 le dice a la vista de colección que no tiene ningún contenido para pintar, así que no se molesta en pedirle atributos o celdas.
Por lo tanto, simplemente anule collectionViewContentSize y proporcione un tamaño adecuado allí, debería resolver su problema.
Olvidé configurar la máscara de aumento automático en falso en la vista de colección:
collectionView.translatesAutoresizingMaskIntoConstraints = false
Para aquellos que tropiezan aquí más tarde ... la razón:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
no se llamaba debido al ítem Tamaño de la colección La altura de ViewFlowLayout era demasiado grande.
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
Si cambio la altura a 410, se ejecutará cellForItemAtIndexPath.
Para mí, actualizo la altura de self.view (la supervista de collectionView) a través de la función de autolayout, y DEBO llamar a layoutIfNeeded
después de eso.
[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];
Para una jerarquía de vista más complicada, consulte este blog . ¡Salvó mi vida!
self.automaticallyAdjustsScrollViewInsets = NO;
Se pueden resolver problemas de diseño. Compruebe las advertencias de diseño de la consola, si existen.
Si su clase es una subclase de UICollectionviewController y está creando collectionView mediante programación, use
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .Vertical
layout.itemSize = CGSizeMake(50, 50)
collectionView?.setCollectionViewLayout(layout, animated: false)
Tal vez solo lo estoy pasando por alto, pero parece que echas de menos tu delegado y fuente de datos. En su archivo de encabezado, asegúrese de haber agregado estos:
<UICollectionViewDelegate, UICollectionViewDataSource>
y en su método viewDidLoad agregue esto:
self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;
Además, si lo está cargando a través de .xib, asegúrese de haber conectado la IBOutlet a UICollectionView.
Tuve el mismo problema. Después de intentar algunas horas con varias técnicas, lo que funcionó para mí fue reiniciar Xcode. Mi cellforitematindexpath fue llamado y las células fueron pobladas con las imágenes correctamente