У меня есть UICollectionView, и он показывает массивы URL-адреса json.

Я хочу добавить еще один массив URL-адресов json в свой collectionView, когда пользователь прокручивает до конца collectionView. Я так делаю, но это не сработало. Например, элементов в collectionView 36, но в collectionView я вижу 6 из них в середине страницы. Мой код:

- (void)loadMore {

NSString *path = @"https://example.com/?json=get_posts&page=2";

path = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:path];

NSData *data = [NSData dataWithContentsOfURL:url];

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

NSArray *array = json[@"posts"];

self.contentArray = [self.contentArray arrayByAddingObjectsFromArray:array];

NSLog(@"%ld",(long)self.contentArray.count);

[self.contentCollection reloadData];

}
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger lastSectionIndex = [self.contentCollection numberOfSections] -1;
    NSInteger lastRowIndex = [self.contentCollection numberOfItemsInSection:lastSectionIndex] -1;
    if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) {
        [self loadMore];
    }
}

Спасибо.

0
user3767387 27 Ноя 2016 в 17:27

3 ответа

Лучший ответ

Хорошо, я исправляю это с помощью кода ниже:

В моем ViewController.h:

@property (assign, nonatomic) int page;
@property (strong, nonatomic) NSArray *contentArray;
@property (strong, nonatomic) IBOutlet UICollectionView *contentCollection;

И в моем ViewController.m:

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
NSInteger lastSectionIndex = [self.contentCollection numberOfSections] - 1;
NSInteger lastRowIndex = [self.contentCollection numberOfItemsInSection:lastSectionIndex] - 1;
if ((indexPath.section == lastSectionIndex) && (indexPath.item == lastRowIndex)) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSString *path = [NSString stringWithFormat:@"http://example.com/?json=get_posts&page=%d",self.page];

    path = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    NSURL *url = [NSURL URLWithString:path];

    NSData *data = [NSData dataWithContentsOfURL:url];

    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSArray *array = json[@"posts"];

    self.contentArray = [self.contentArray arrayByAddingObjectsFromArray:array];

    NSLog(@"%ld",(long)self.contentArray.count);
    dispatch_async(dispatch_get_main_queue(), ^ {
    [self.contentCollection reloadData];
        self.page = self.page + 1;
        });
    });
}}
0
user3767387 28 Ноя 2016 в 17:22

Не инициализируйте self.contentArray повторно.

Просто сделай [self.contentArray addObjectsFromArray:array]; Он добавит новые объекты в старый массив. Но убедитесь, что contentArray - это NSMutableArray.

0
Joseph El Khoury 28 Ноя 2016 в 13:18
self.contentArray = [NSMutableArray array];
NSArray *array = json[@"posts"];
[self.contentArray addObjectsFromArray: array];
NSLog(@"%ld",(long)self.contentArray.count);

// Для массива используйте этот addObjectsFromArray

0
Lalit kumar 27 Ноя 2016 в 14:45