es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema parece estar con el IndexPath que estás usando en scrollToItem. 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 utilizando numberOfItems (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:

    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 - 1, section: 0), at: .bottom, animated: false)
            }
        }
    }
    

    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.

Comments are closed.