¿Cómo puedo verificar si un índice es válido, evitando así un error de "bash de desplazamiento a una ruta de índice no válida"?

¿Cómo puedo verificar si un path index es válido o no?

Quiero desplazarme a una ruta de índice, pero a veces obtengo un error si las subidas de la vista de colección no se han terminado de cargar.

Puedes verificar

- numberOfSections - numberOfItemsInSection: 

de su UICollection​View​Data​Source para ver si su ruta de índice es válida.

@ La respuesta de ABakerSmith está cerca, pero no del todo bien.

La respuesta depende de su model.

Si tiene una vista de colección de varias secciones (o la vista de la tabla para el caso, el mismo problema), entonces es bastante común utilizar una matriz de matrices para save sus datos.

La matriz externa contiene sus secciones, y cada matriz interna contiene las filas para esa sección.

Entonces podrías tener algo como esto:

 struct TableViewData { //Dummy structure, replaced with whatever you might use instead var heading: String var subHead: String var value: Int } typealias RowArray: [TableViewData] typeAlias SectionArray: [RowArray] var myTableViewData: SectionArray 

En ese caso, cuando se le presente un índicePath, necesitará interrogar su object model (myTableViewData, en el ejemplo anterior)

El código podría verse así:

 func indexPathIsValid(theIndexPath: NSIndexPath) -> Bool { let section = theIndexPath.section! let row = theIndexPath.row! if section > myTableViewData.count-1 { return false } let aRow = myTableViewData[section] return aRow.count < row } 

EDITAR:

@ABakerSmith tiene un giro interesante: Preguntar la fuente de datos. De esta forma, puede escribir una solución que funcione independientemente del model de datos. Su código está cerca, pero aún no está del todo correcto. Realmente debería ser esto:

 func indexPathIsValid(indexPath: NSIndexPath) -> Bool { let section = indexPath.section! let row = indexPath.row! let lastSectionIndex = numberOfSectionsInCollectionView(collectionView) - 1 //Make sure the specified section exists if section > lastSectionIndex { return false } let rowCount = self.collectionView( collectionView, numberOfItemsInSection: indexPath.section) - 1 return row <= rowCount } 

¿Una solución más concisa?

 func indexPathIsValid(indexPath: NSIndexPath) -> Bool { if indexPath.section >= numberOfSectionsInCollectionView(collectionView) { return false } if indexPath.row >= collectionView.numberOfItemsInSection(indexPath.section) { return false } return true } 

o más compacto, pero less legible …

 func indexPathIsValid(indexPath: NSIndexPath) -> Bool { return indexPath.section < numberOfSectionsInCollectionView(collectionView) && indexPath.row < collectionView.numberOfItemsInSection(indexPath.section) } 

¿Quizás esto es lo que estás buscando?

- (UICollectionViewCell *)cellForItemAtIndexPath:(NSIndexPath *)indexPath

Valor de retorno: el object de celda en la ruta de índice correspondiente o nil si la celda no es visible o indexPath está fuera de range.