Najprostszym sposobem, aby wstawić nowe komórki do UICollectionView bez konieczności przeładowania całą swoją komórkę jest za pomocą performBatchUpdates, które można łatwo zrobić, wykonując czynności opisane poniżej.
// Lets assume you have some data coming from a NSURLConnection
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *erro)
{
// Parse the data to Json
NSMutableArray *newJson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
// Variable used to say at which position you want to add the cells
int index;
// If you want to start adding before the previous content, like new Tweets on twitter
index = 0;
// If you want to start adding after the previous content, like reading older tweets on twitter
index = self.json.count;
// Create the indexes with a loop
NSMutableArray *indexes = [NSMutableArray array];
for (int i = index; i < json.count; i++)
{
[indexes addObject:[NSIndexPath indexPathForItem:i inSection:0]];
}
// Perform the updates
[self.collectionView performBatchUpdates:^{
//Insert the new data to your current data
[self.json addObjectsFromArray:newJson];
//Inser the new cells
[self.collectionView insertItemsAtIndexPaths:indexes];
} completion:nil];
}
Więc, kiedy pierwszy raz użyć '[UICollectionView reloadData]' I powinien zapisać indeks ostatniej komórki używany, a potem, kiedy wywołać metodę, aby dodać więcej komórek należy użyć swój najnowszy indexPath komórek, prawidłowe ? @chris –
W ogóle nie potrzebujesz '[UICollectionView reloadData]' podczas dodawania elementów. Po prostu wykonaj 'insertItemsAtIndexPaths:' i upewnij się, że kolejne wywołania do źródła danych 'metody 'collectionView: numberOfItemsInSection:' i 'collectionView: cellForItemAtIndexPath:' odzwierciedlają twoje zmiany. – chris
Zrobiłem to na początku. Ale kiedy nowe komórki zostaną pokazane na ekranie, pojawi się komunikat: 'Kończenie aplikacji z powodu nieprzechwyconego wyjątku 'NSRangeException', powód: '- [__ NSCFArray objectAtIndex:]: index (36) beyond bounds (36)' ' @ Chris, czy wiesz, co zrobiłem źle? –