如何在collectionviewcontroller中加载更多数据

时间:2015-11-20 18:12:17

标签: ios collectionview

我遇到了一个问题,即在collectionviewcontroller的底部向下滚动时,我无法正确地在collectionview中重新加载新数据。如果(indexPath.row == [selectedVideoData count] - 1),我在此代码处开始的问题。下面是我对collectionviewcontroller的完整代码:

#import "PageVideosCVC.h"
#import "facebook.h"
#import "MBProgressHUD.h"
#import <AFNetworking/AFNetworking.h>
#import <AVFoundation/AVFoundation.h>
#import <SDWebImage/UIImageView+WebCache.h>

@interface PageVideosCVC () <UICollectionViewDataSource,UICollectionViewDelegate>

@end

@implementation PageVideosCVC
@synthesize selectedVideoData, selectNextVideoData;

static NSString * const reuseIdentifier = @"Cell";

-(void) viewWillAppear:(BOOL)animated {

    UINavigationBar *navBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    [UINavigationBar appearance].barTintColor = [UIColor lightGrayColor];
    [self.view addSubview: navBar];


    UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc] initWithTitle:@"< Back"
                                                                   style:UIBarButtonItemStylePlain
                                                                  target:self
                                                                  action:@selector(backButtonTapped:)];

//    UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done"
//                                                                 style:UIBarButtonItemStyleBordered
//                                                                target:self action:nil];

    NSString *selectedPageName = [[NSString alloc] initWithFormat:@"%@", self.pageName];

    UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:selectedPageName];
 //   navItem.rightBarButtonItem = doneItem;
    navItem.leftBarButtonItem = cancelItem;
    navBar.items = [NSArray arrayWithObjects: navItem,nil];

    [UIBarButtonItem appearance].tintColor = [UIColor blueColor];

}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;

    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;

    facebook *fb = [[facebook alloc] init];
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];

    NSDictionary *fbVideoParams = @{ @"fields": @"videos.limit(10){source,description,thumbnails.limit(1),length}"};
    [fb fetchVideoInformationFromPages:fbVideoParams videoID:self.videoID completionHandler:^(NSDictionary *videoResult) {

        if (videoResult != nil) {
            selectedVideoData = [videoResult valueForKeyPath:@"videos.data"];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.collectionView reloadData];
                [MBProgressHUD hideHUDForView:self.view animated:YES];
            });
        }

    }];

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = NO;

    // Register cell classes
   // [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

    // Do any additional setup after loading the view.
}


#pragma mark <UICollectionViewDataSource>

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return selectedVideoData.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    // Configure the cell

    // This is a last cell, I wanna load next video data from fb.

    if (indexPath.row == [selectedVideoData count] - 1) {

        NSString *fbToken = [facebook currentFBAccessToken];
        NSString *fbNextVideoURL = [NSString stringWithFormat:@"https://graph.facebook.com/v2.5/606246146140197/videos?access_token=%@&pretty=0&fields=source,description,thumbnails.limit(1),length&limit=10&after=ODYxOTA5OTEzOTA3MTUx", fbToken];

        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

        [MBProgressHUD showHUDAddedTo:self.view animated:YES];

        [manager GET:fbNextVideoURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            selectNextVideoData = [responseObject valueForKey:@"data"];
            NSLog(@"JSON Next Video: %@", selectNextVideoData);

            dispatch_async(dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:self.view animated:YES];


                // I had a problem setting the right thumbnail here.

                UIImageView *imgView = (UIImageView *)[cell viewWithTag:100];
                NSURL *thumbnailImage = [NSURL URLWithString:[selectNextVideoData valueForKeyPath:@"thumbnails.data"]];
               // NSLog(@"JSON Next Video: %@", thumbnailImage);
                [imgView sd_setImageWithURL:thumbnailImage placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
                [self.collectionView reloadData];

            });

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];

    } else {
        UIImageView *imgView = (UIImageView *)[cell viewWithTag:100];
        NSURL *thumbnailImage = [NSURL URLWithString:[selectedVideoData valueForKeyPath:@"thumbnails.data.uri"][indexPath.row][0]];
        [imgView sd_setImageWithURL:thumbnailImage placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
    }

    return cell;
}

#pragma mark <UICollectionViewDelegate>

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

    // NSLog(@"videos : %@", selectedVideoData);
    // NSLog(@"videos source : %@", [selectedVideoData valueForKeyPath:@"source"][indexPath.row]);

    NSURL *videoURL = [NSURL URLWithString:[selectedVideoData valueForKeyPath:@"source"][indexPath.row]];

    self.playerController = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];

    [[self.playerController view] setFrame:[self.view bounds]]; // Frame must match parent view
    [self.view addSubview:[self.playerController view]];
    self.playerController.movieSourceType = MPMovieSourceTypeStreaming;
    self.playerController.controlStyle = MPMovieControlStyleFullscreen;


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doneButtonClick:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    [self.playerController play];

    // Play the video using AVPlayer iOS9 above
//    AVPlayer *player = [AVPlayer playerWithURL:videoURL];
//    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
//    playerLayer.frame = self.view.bounds;
//    [self.view.layer addSublayer:playerLayer];
//    [player play];

}

-(void)doneButtonClick:(NSNotification*)aNotification{
    NSNumber *reason = [aNotification.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];

    if ([reason intValue] == MPMovieFinishReasonUserExited) {
        // Your done button action here
        // [self dismissViewControllerAnimated:YES completion:nil];
        NSLog(@"done button tapped");

        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:MPMoviePlayerDidExitFullscreenNotification
                                                      object:nil];
        [self.playerController stop];
        [self.playerController.view removeFromSuperview];
    }
}




- (IBAction)backButtonTapped:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}


@end

1 个答案:

答案 0 :(得分:0)

也许这种方法可以尝试使用scrollView Delegate方法:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    // NSLog(@"offset: %f", offset.y);   
    // NSLog(@"content.height: %f", size.height);   
    // NSLog(@"bounds.height: %f", bounds.size.height);   
    // NSLog(@"inset.top: %f", inset.top);   
    // NSLog(@"inset.bottom: %f", inset.bottom);   
    // NSLog(@"pos: %f of %f", y, h);

    float reload_distance = 10;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
    }
}