Ich habe eine typische UICollectionView, die UICollectionViewFlowLayout in einer vertikalen Weise verwendet. Ich verwende eine Rest-API mit Paginierung, um die Sammlungsansicht zu füllen. Um die nächste Seite zu triggern zum Download, ich bin mit dem Delegaten, wenn es für das Fußzeile Layout fragt:Probleme beim Einfügen in UICollectionView-Abschnitt, der eine Fußzeile enthält
- (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;
}
Hier ist der Code hinter meinem 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];
}];
}
Wenn ich laufe mich kann zu meinem ViewController gehen und die erste Seite der geladenen Assets sehen. Wenn ich ich nach unten scrollen, werden die Fußzeile Ansicht sehen (die einen Spinner enthält), aber dann wird der Code an der Ausnahme Bruchstelle an der Linie brechen:
[weakSelf.collectionView insertItemsAtIndexPaths:indexPaths];
Assertionsfehler in - [UICollectionViewData layoutAttributesForSupplementaryElementOfKind: atIndexPath:] /SourceCache/UIKit/UIKit-3185.20/UICollectionViewData.m:829,
Dann, wenn ich weiterhin mit dem Fehler abstürzt:
2014-06-11 16: 39: 58,335 Radius-iOS [ 4901: 525006] * App beenden wegen abgefangene Ausnahme 'NSInternalInconsistencyException', Grund: 'nein UICollectionViewLayoutAttributes Beispiel für -layoutAttributesForSupplementaryElementOfKind: UICollectionElementKindSectionFooter bei Wegs {Länge = 2, path = 0 - 0}' * ersten Wurf Call-Stack:
Dies ist rätselhaft mich. layoutAttributesForSupplementaryElementOfKind klingt, als ob es etwas mit der Layout-Klasse zu tun hat, aber ich verwende kein benutzerdefiniertes Flow-Layout, sondern das Standard-Layout. Es klingt, als wäre Apples Code verrückt, aber ich fühle, dass ich alles richtig benutze.
Nun, wenn ich mich bewege den Anruf:
[self loadNextPageOfAssets];
von der Zusatz Zelle dequeue UICollectionViewCell deque, und entfernen Sie die Fußzeile Ansichten alle zusammen an teh, dann der Einsatz funktioniert super.
Für jetzt rufe ich reloadData anstelle von einfügen, aber das ist UGLY.
Betrachte ich etwas über die Fußzeilen?
wel .. für den Anfang könnte man prüfen, was das Zusatzelement ist eine Art, die in viewForSupplementaryElementOfKind – govi