La UICollectionView se bloquea al desplazarse hasta el último elemento.
Hay un ViewController
en mi aplicación que obtiene comentarios en tiempo real. Cuando se obtiene un nuevo comentario, desplazo hacia abajo la CollectionView
vertical. El problema es que mi Crashlytics
muestra muchos errores en la llamada de scrollToItem
y no puedo recrearlo yo mismo.
No puedo entender cómo es posible que se produzca un error, ya que he tenido en cuenta todos los posibles valores. Consulto a la CollectionView
cuántos elementos tiene y, si tiene al menos uno, desplazo hasta el último.
Aquí está mi código:
fileprivate func handleFetchedCommentsResponse() {
DispatchQueue.main.async {
self.chatCollectionView.reloadData()
}
// -------------------------------------------
let numberOfItems = chatCollectionView.numberOfItems(inSection: 0)
if numberOfItems > 0 {
DispatchQueue.main.async {
self.chatCollectionView.scrollToItem(at: IndexPath(row: numberOfItems, section: 0), at: .bottom, animated: false)
}
}
}
Y aquí está el registro del error:
Excepción fatal: NSInternalInconsistencyException Se ha intentado desplazar la vista de colección a un elemento fuera de límites (20) cuando solo hay 20 elementos en la sección 0. Colección:
<uicollectionview: 0x10b06f400;="" frame="(12" 480.667;="" 396="" 355.333);="" clipstobounds="YES;" autoresize="RM+BM;" gesturerecognizers=""></uicollectionview:><nsarray: 0x281d426d0="">; layer = <calayer: 0x280afe280="">; contentOffset: {0, 568.33333333333337}; contentSize: {396, 876}; adjustedContentInset: {0, 0, 0, 0}; layout: <uicollectionviewflowlayout: 0x107b3bab0="">; dataSource: <nup.voiceroomviewcontroller: 0x10b019800="">>
.
PD: Mi CollectionView
solo tiene una sección.</nup.voiceroomviewcontroller:>
davy.ai
El problema parece estar con el
IndexPath
que estás usando enscrollToItem
. Según el registro del fallo, estás intentando desplazarte al elemento en el índice 20, pero solo hay 20 elementos en la sección 0. Esto significa que el último elemento en tu vista de colección debería tener un índice de 19 (ya que los arrays en Swift comienzan en cero). Sin embargo, en tu código estás utilizandonumberOfItems
(que es la cuenta de elementos en la vista de colección) como el índice para el último elemento.Para solucionar este problema, necesitas restar 1 de
numberOfItems
para obtener el índice correcto del último elemento en la vista de colección.Aquí tienes el código actualizado:
Al restar 1 de
numberOfItems
, obtendrás el índice correcto del último elemento en tu vista de colección y esto debería resolver el problema del fallo.