uicollectionviewcontroller objective-c-blocks uicollectionview uicollectionviewcell completionhandler

objective-c-blocks - uicollectionviewcontroller - uicollectionviewcell indexpath



La recarga de un UICollectionView usando el método reloadData se devuelve inmediatamente antes de recargar los datos (3)

Necesito saber cuándo se ha completado la recarga de un UICollectionView para configurar las celdas después (porque no soy el origen de datos de las celdas, de lo contrario ya lo habría hecho ...)

He intentado código como

[self.collectionView reloadData]; [self configure cells]; // BOOM! cells are nil

También he intentado usar

[self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:^(BOOL finished) { // notify that completed and do the configuration now }];

pero cuando vuelvo a cargar los datos me sale fallas.

¿Cómo puedo volver a cargar los datos en la recopilación, y solo cuando haya terminado de volver a cargarse?


Esto se debe a que las celdas se agregan durante layoutSubviews no en reloadData. Dado que layoutSubviews se realiza durante la siguiente pasada del ciclo de ejecución después de reloadData, sus celdas están vacías. Intenta hacer esto:

[self.collectionView reloadData]; [self.collectionView layoutIfNeeded]; [self configure cells];

Tuve un problema similar y lo resolví de esta manera.


La vista de colección no es compatible para ser recargada animadamente con la ayuda de reloadData . Todas las animaciones deben realizarse con métodos, tales como

[collectionView deleteItemsAtIndexPaths:indexesToDelete]; [collectionView insertSections:sectionsToInsert]; [collectionView reloadItemsAtIndexPaths:fooPaths];

dentro de performBatchUpdates: bloque. El método reloadData solo se puede utilizar para una actualización aproximada, cuando todos los elementos se eliminan y se distribuyen nuevamente sin animación.


Si desea realizar algún código después de que su collectionView haya completado su método reloadData (), intente esto (Swift):

self.collectionView.reloadData() self.collectionView.layoutIfNeeded() dispatch_async(dispatch_get_main_queue()) { () -> Void in // Put the code you want to execute when reloadData is complete in here }

La razón por la que esto funciona es porque el código dentro del bloque de envío se pone al final de la línea (también conocido como cola). Esto significa que está esperando en línea a que todas las operaciones del hilo principal finalicen, incluidos los métodos de reloadData (), antes de que se convierta en el hilo principal.