xcode - tutorial - uicollectionviewcontroller
UICollectionView reloadItemsAtIndexPaths (3)
He estado tratando de entender el método reloadItemsAtIndexPaths de UICollectionView.
Tengo una matriz de objetos llamada objectsArray. Cuando un usuario se desplaza al final de mi vista de colección, busco el siguiente lote de objetos desde el backend y lo anexo a objectsArray llamando a [objectsArray addObjectsFromArray: objects]; Después de hacerlo, llamo a [self.collectionView reloadData] que sé que es caro.
Me gustaría optimizar con el siguiente código pero obtengo una falla de aserción al llamar a reloadItemsAtIndexPaths.
if (self.searchPage == 0) {
parseObjectsArray = [[NSMutableArray alloc] initWithArray:relevantDeals];
[self.collectionView reloadData];
} else {
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
for (int i = 0; i < [relevantDeals count]; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
[indexPaths addObject:indexPath];
}
[parseObjectsArray addObjectsFromArray:relevantDeals];
[self.collectionView reloadItemsAtIndexPaths:indexPaths];
//[self.collectionView reloadData];
}
Error: * Error de aserción en - [UICollectionView _endItemAnimations], /SourceCache/UIKit/UIKit-2903.2/UICollectionView.m:3716
Cualquier ayuda / consejo es muy apreciada.
¡Gracias!
Este error a menudo surge cuando aumenta / disminuye la cantidad de elementos en la matriz pero no coincide con el método de fuente de datos
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
¿Lo estás actualizando apropiadamente?
Parece que los elementos que se agregan son nuevos, en otras palabras, está agregando elementos que no estaban allí antes. En ese caso, simplemente reemplace reloadItemsAtIndexPaths: indexPaths con insertItemsAtIndexPaths:
[self.collectionView insertItemsAtIndexPaths:indexPaths]; // Use this for newly added rows
//[self.collectionView reloadItemsAtIndexPaths:indexPaths]; // Use this for existing rows which have changed
El error de afirmación fue engañoso. No fue hasta después de que implementé
@try
{
[self.collectionView insertItemsAtIndexPaths:indexPaths];
}
@catch (NSException *except)
{
NSLog(@"DEBUG: failure to insertItemsAtIndexPaths. %@", except.description);
}
Me di cuenta que estaba calculando mis IndexPaths mal. El desplazamiento de mi índice para los nuevos objetos estaba desactivado, lo que hace que mi colección piense que estaba agregando más objetos de los especificados en numberOfItemsInSection.
¡Gracias a todos los que intentaron ayudar!