第一篇、实现上拉和下拉刷新

简介:

  在iOS开发中,我们经常要用到下拉刷新和上拉刷新来加载新的数据,当前这也适合分页。iOS原生就带有该方法,下面就iOS自带的下拉刷新方法来简单操作。

功能:

1.下拉刷新(用系统自带的刷新控件实现)

/**

 *  集成下拉刷新
 */
-(void)setupRefresh
{
    //1.添加刷新控件
    UIRefreshControl *control=[[UIRefreshControl alloc]init];
    [control addTarget:self action:@selector(refreshStateChange:) forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:control];
     
    //2.马上进入刷新状态,并不会触发UIControlEventValueChanged事件
    [control beginRefreshing];
     
    // 3.加载数据
    [self refreshStateChange:control];
}
/**
 *  UIRefreshControl进入刷新状态:加载最新的数据
 */
-(void)refreshStateChange:(UIRefreshControl *)control
{
    // 3.发送请求
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
     
    [mgr GET:@"https://api.weibo.com/2/statuses/public_timeline.json" parameters:nil success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject){
         
        //1.获取数据,处理数据,传递数据给tableView,如:
         
        // 将最新的微博数据,添加到总数组的最前面
//        NSRange range = NSMakeRange(0, newStatuses.count);
//        NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
//        [self.statuses insertObjects:newStatuses atIndexes:set];
         
        //2.刷新表格
        [self.tableView reloadData];
         
        // 3. 结束刷新
        [control endRefreshing];
         
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
 
        // 结束刷新刷新 ,为了避免网络加载失败,一直显示刷新状态的错误
        [control endRefreshing];
    }];
}

 

2.上拉刷新

 

#import <UIKit/UIKit.h>
 
@interface JQLoadMoreFooter : UIView
+(instancetype)footer;
@end

#import "JQLoadMoreFooter.h"
 
@implementation JQLoadMoreFooter
 
+(instancetype)footer
{
  // 加载一个xib文件(label充满整个view)
return [[[NSBundle mainBundle] loadNibNamed:@"JQLoadMoreFooter" owner:nil options:nil] lastObject]; } @end

 

初始化:

/**
 *  集成上拉刷新
 */
-(void)setupDownRefresh
{
    HWLoadMoreFooter *footer = [HWLoadMoreFooter footer];
    footer.hidden = YES;
    self.tableView.tableFooterView = footer;
}

 

- (void)loadMoreStatus
{
    // 1.请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
     
    // 2.拼接请求参数
    HWAccount *account = [HWAccountTool account];
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"access_token"] = account.access_token;
     
    // 取出最后面的微博(最新的微博,ID最大的微博)
    HWStatus *lastStatus = [self.statuses lastObject];
    if (lastStatus) {
        // 若指定此参数,则返回ID小于或等于max_id的微博,默认为0。
        // id这种数据一般都是比较大的,一般转成整数的话,最好是long long类型
        long long maxId = lastStatus.idstr.longLongValue - 1;
        params[@"max_id"] = @(maxId);
    }
     
    // 3.发送请求
    [mgr GET:@"https://api.weibo.com/2/statuses/friends_timeline.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
        // 将 "微博字典"数组 转为 "微博模型"数组
        NSArray *newStatuses = [HWStatus objectArrayWithKeyValuesArray:responseObject[@"statuses"]];
         
        // 将更多的微博数据,添加到总数组的最后面
        [self.statuses addObjectsFromArray:newStatuses];
         
        // 刷新表格
        [self.tableView reloadData];
         
        // 结束刷新(隐藏footer)
        self.tableView.tableFooterView.hidden = YES;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        HWLog(@"请求失败-%@", error);
         
        // 结束刷新
        self.tableView.tableFooterView.hidden = YES;
    }];
}

 

实现UIScrollViewdelegate Methods

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //    scrollView == self.tableView == self.view
    // 如果tableView还没有数据,就直接返回
    if (self.statuses.count == 0 || self.tableView.tableFooterView.isHidden == NO) return;
     
    CGFloat offsetY = scrollView.contentOffset.y;
     
    // 当最后一个cell完全显示在眼前时,contentOffset的y值
    CGFloat judgeOffsetY = scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.height - self.tableView.tableFooterView.height;
    if (offsetY >= judgeOffsetY) { // 最后一个cell完全进入视野范围内
        // 显示footer
        self.tableView.tableFooterView.hidden = NO;
         
        // 加载更多的微博数据
        [self loadMoreStatus];
    }
}

 

posted on 2016-08-19 22:33  久冬不雨  阅读(322)  评论(0编辑  收藏  举报