Ho un UICollectionView tipico che utilizza UICollectionViewFlowLayout in modo verticale. Sto usando un'API di riposo con paginazione per popolare la vista raccolta. Al fine di attivare la pagina successiva per scaricare, sto usando il delegato quando chiede per il layout piè di pagina:Problemi che si inseriscono nella sezione UICollectionView che contiene un piè di pagina
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
RDLoadMoreReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"RDLoadMoreReusableView" forIndexPath:indexPath];
view.delegate = self;
[view start];
[self loadNextPageOfAssets];
return view;
}
Ecco il codice dietro le mie loadNextPageOfAssets:
-(void)loadNextPageOfAssets{
__weak RDRadiusGridViewController *weakSelf = self;
// Increment page and request assets. They are added to cluster.assets before the completion block is called.
self.cluster.pagination.page++;
[self.cluster requestAssetsWithCompletionBlock:^(NSArray *assets) {
SM_LOG_DEBUG(@"page.total: %ld assets.count: %ld", self.cluster.pagination.totalCount, (long)assets.count);
NSMutableArray *indexPaths = [[NSMutableArray alloc]initWithCapacity:assets.count];
for(NSUInteger index = 0; index < assets.count; index++){
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.cluster.assets.count - assets.count + index inSection:0];
SM_LOG_DEBUG(@"Inserting indexPath: %ld:%ld", (long)indexPath.item, (long)indexPath.section);
[indexPaths addObject:indexPath];
}
[weakSelf.collectionView performBatchUpdates:^{
[weakSelf.collectionView insertItemsAtIndexPaths:indexPaths];
} completion:^(BOOL finished) {
}];
// [weakSelf.collectionView reloadData];
}];
}
Quando eseguo mi posso andare al mio ViewController e vedere la prima pagina delle risorse caricate. Se ho scorrere verso il basso vedrò la vista piè di pagina (che contiene un filatore), ma poi il codice pausa al punto di rottura un'eccezione alla riga:
[weakSelf.collectionView insertItemsAtIndexPaths:indexPaths];
errore di asserzione in - [UICollectionViewData layoutAttributesForSupplementaryElementOfKind: atIndexPath:] , /SourceCache/UIKit/UIKit-3185.20/UICollectionViewData.m:829
Poi se continuo si blocca con l'errore:
2014/06/11 16: 39: 58,335 Radius-iOS [ 4901: 525006] * Termina l'applicazione a causa di eccezione non identificata 'NSInternalInconsistencyException', la ragione: 'nessuna istanza UICollectionViewLayoutAttributes per -layoutAttributesForSupplementaryElementOfKind: UICollectionElementKindSectionFooter al sentiero {lunghezza = 2, il percorso = 0 - 0}' * primo stack di chiamate tiro:
Questo è sconcertante per me. layoutAttributesForSupplementaryElementOfKind suona come se avesse a che fare con la classe di layout, ma non sto usando un layout di flusso personalizzato piuttosto quello predefinito fornito. Sembra che il codice Apple sia pazzo, ma sento che sto usando tutto correttamente.
Ora, se mi muovo la chiamata:
[self loadNextPageOfAssets];
dal dequeue cellulare supplementare alla teh UICollectionViewCell deque, e rimuovere i punti di vista del piè di pagina tutti insieme, poi l'inserto funziona alla grande.
Per ora sto chiamando reloadData invece di insert, ma questo è UGLY.
Sto trascurando qualcosa sui footer?
wel .. per cominciare si potrebbe verificare ciò che è l'elemento integrativo tipo che viene passato in viewForSupplementaryElementOfKind – govi