He estado actualizando mis aplicaciones para que se ejecuten en iOS 7, que en su mayor parte funciona sin problemas. He notado en más de una aplicación que elreloadData
método de a UICollectionViewController
no funciona como antes.
Cargaré UICollectionViewController
, rellenaré UICollectionView
con algunos datos como de costumbre. Esto funciona muy bien la primera vez. Sin embargo, si solicito nuevos datos (rellenar el UICollectionViewDataSource
) y luego llamo reloadData
, consultará la fuente de datos paranumberOfItemsInSection
y numberOfSectionsInCollectionView
, pero no parece llamar cellForItemAtIndexPath
la cantidad adecuada de veces.
Si cambio el código para recargar solo una sección, funcionará correctamente. No es un problema para mí cambiarlos, pero no creo que deba hacerlo. reloadData
debe recargar todas las celdas visibles de acuerdo con la documentación.
¿Alguien más ha visto esto?
fuente
reloadData
después de viewDidAppear parece resolver el problema, su horrible solución y necesita solución. Espero que alguien me ayude aquí.Respuestas:
Fuerza esto en el hilo principal:
fuente
En mi caso, la cantidad de celdas / secciones en la fuente de datos nunca cambió y solo quería volver a cargar el contenido visible en la pantalla.
Me las arreglé para evitar esto llamando:
luego:
fuente
performBatchUpdates:completion:
bloque?Tuve exactamente el mismo problema, sin embargo, me las arreglé para encontrar qué estaba pasando mal. En mi caso, estaba llamando a reloadData desde collectionView: cellForItemAtIndexPath: que parece no ser correcto.
El envío de la llamada de reloadData a la cola principal solucionó el problema una vez y para siempre.
fuente
reloadData
fue llamado por un observador de cambios.collectionView(_:willDisplayCell:forItemAtIndexPath:)
La recarga de algunos elementos no funcionó para mí. En mi caso, y solo porque el collectionView que estoy usando tiene solo una sección, simplemente recargo esa sección en particular. Esta vez los contenidos se recargan correctamente. Es extraño que esto solo esté sucediendo en iOS 7 (7.0.3)
fuente
Tuve el mismo problema con reloadData en iOS 7. Después de una larga sesión de depuración, encontré el problema.
En iOS7, reloadData en UICollectionView no cancela las actualizaciones anteriores que aún no se han completado (Actualizaciones que llamaron dentro de performBatchUpdates: block).
La mejor solución para resolver este error es detener todas las actualizaciones que se procesan actualmente y llamar a reloadData. No encontré una manera de cancelar o detener un bloque de performBatchUpdates. Por lo tanto, para resolver el error, guardé una bandera que indica si hay un bloque performBatchUpdates que se procesa actualmente. Si no hay un bloque de actualización que se procese actualmente, puedo llamar a reloadData inmediatamente y todo funciona como se esperaba. Si hay un bloque de actualización que se procesa actualmente, llamaré a reloadData en el bloque completo de performBatchUpdates.
fuente
Rápido 5 - 4 - 3
Swift 2
fuente
Yo también tuve este problema. Por coincidencia, agregué un botón en la parte superior de la vista de colección para forzar la recarga para la prueba, y de repente se comenzaron a llamar los métodos.
También agregando algo tan simple como
haría que los métodos sean llamados
También jugué con el tamaño del marco, y listo, se estaban llamando a los métodos.
Hay muchos errores con iOS7 UICollectionView.
fuente
Puedes usar este método
Puede agregar todos los
indexPath
objetos de suUICollectionView
matrizarrayOfAllIndexPaths
iterando el ciclo para todas las secciones y filas con el uso del método siguienteEspero que lo haya entendido y pueda resolver su problema. Si necesita más explicaciones, responda.
fuente
La solución dada por Shaunti Fondrisi es casi perfecta. Pero tal fragmento de código o códigos como poner en cola la ejecución de
UICollectionView
'sreloadData()
toNSOperationQueue
' s demainQueue
hecho pone el tiempo de ejecución al comienzo del siguiente ciclo de eventos en el ciclo de ejecución, lo que podría hacer laUICollectionView
actualización con un movimiento rápido.Para solucionar este problema. Debemos poner el tiempo de ejecución de la misma pieza de código al final del ciclo de eventos actual pero no al comienzo del siguiente. Y podemos lograrlo haciendo uso de
CFRunLoopObserver
.CFRunLoopObserver
observa todas las actividades de espera de la fuente de entrada y la actividad de entrada y salida del ciclo de ejecución.Entre esas actividades,
.AfterWaiting
se puede observar cuando el ciclo de eventos actual está a punto de terminar, y.BeforeWaiting
se puede observar cuando acaba de comenzar el siguiente ciclo de eventos.Como solo hay una
NSRunLoop
instancia porNSThread
yNSRunLoop
maneja exactamente elNSThread
, podemos considerar que los accesos provienen de la mismaNSRunLoop
instancia, nunca cruzan subprocesos.Según los puntos mencionados anteriormente, ahora podemos escribir el código: un despachador de tareas basado en NSRunLoop:
Con el código anterior, ahora podemos enviar la ejecución de
UICollectionView
'sreloadData()
hasta el final del ciclo de eventos actual mediante un fragmento de código:De hecho, un despachador de tareas basado en NSRunLoop ya ha estado en uno de mis marcos de trabajo personales: Nest. Y aquí está su repositorio en GitHub: https://github.com/WeZZard/Nest
fuente
funcionó para mí.
fuente
Gracias en primer lugar por este hilo, muy útil. Tuve un problema similar con Reload Data, excepto que el síntoma era que las celdas específicas ya no podían seleccionarse de manera permanente mientras que otras sí. No hay llamada al método indexPathsForSelectedItems o equivalente. Depuración indicada para recargar datos. Probé las dos opciones anteriores; y terminé adoptando la opción ReloadItemsAtIndexPaths ya que las otras opciones no funcionaron en mi caso o estaban haciendo que la vista de la colección parpadeara durante aproximadamente un milisegundo. El siguiente código funciona bien:
fuente
También sucedió conmigo en iOS 8.1 sdk, pero lo entendí correctamente cuando noté que incluso después de actualizar
datasource
el métodonumberOfItemsInSection:
no devolvía el nuevo recuento de elementos. Actualicé el recuento y lo hice funcionar.fuente
¿Establece UICollectionView.contentInset? eliminar el edgeInset izquierdo y derecho, todo está bien después de que los elimino, el error todavía existe en iOS8.3.
fuente
Compruebe que cada uno de los métodos delegados de UICollectionView haga lo que espera que haga. Por ejemplo, si
no devuelve un tamaño válido, la recarga no funcionará ...
fuente
prueba este código.
fuente
Así es como funcionó para mí en Swift 4
fuente
fuente