iOS-上拉刷新,下拉加载-----------详解

烈酒焚心 提交于 2020-01-05 02:02:34

一.使用的第三方库

1.AFNetworking       ----> 网络请求

2. MJRefresh           ----> 刷新

3. MBProgressHUD  ----> 缓冲视图

二.原理

1.  上拉加载

每加载一次,用一个变量(_pageNumber)记载加载的页码数.这样每次获取的数据就会多一页的数据. 但是如果上拉之后,没有加载到数据(比如:1.网络请求失败. 2.网络请求成功,但是没有获取到数据. 3.网络请求成功,并且获取到数据,但是数据为空),这样的情况下,该变量(_pageNumber)计数减一.

2. 下拉刷新

(1) 页数设置为1.只请求一页的数据,达到刷新的目的.

(2) 将数据源的数据清空

三. 代码

#import "ViewController.h"

 

#import "AFNetworking.h"

#import "MJRefresh.h"

#import "MBProgressHUD.h"

 

#import "Cell.h"

#import "Model.h"

 

 #define kWidth [UIScreen mainScreen].bounds.size.width

#define kHeight [UIScreen mainScreen].bounds.size.height

 

@interface ViewController () <UITableViewDelegate,UITableViewDataSource,MJRefreshBaseViewDelegate>

{

    MJRefreshHeaderView *_headerView;

    MJRefreshFooterView *_footerView;

    

    NSInteger            _pageNumber;

}

 

@property (nonatomic, strong) NSMutableArray   * dataSourse;

@property (nonatomic, strong) UITableView      * tableView;

 

@end

 

 

 

@implementation ViewController

 

- (void)viewDidLoad

{

    [super viewDidLoad];

 

    //初始化数据

    self.dataSourse = [NSMutableArray arrayWithCapacity:0];

    _pageNumber = 1;

    

    

    //创建 表格视图

    [self createTableView];

}

 

- (void)createTableView

{

    

    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, kWidth, kHeight - 20) style:UITableViewStylePlain];

    self.tableView.delegate = self;

    self.tableView.dataSource = self;

    [self.view addSubview:self.tableView];

    

    

    //头部刷新视图

    _headerView = [MJRefreshHeaderView header];

    _headerView.delegate = self;

    _headerView.scrollView = self.tableView;

    

    //尾部视图

    _footerView = [MJRefreshFooterView footer];

    _footerView.delegate = self;

    _footerView.scrollView = self.tableView;

    

    

    //发送网络请求

    [self sendNetWorkingWithPage:1];

}

 

- (void)sendNetWorkingWithPage:(NSInteger )pageNumber

{

    //开启缓冲视图

    MBProgressHUD * hub = [MBProgressHUD showHUDAddedTo:self.view animated:YES];

    hub.label.text = @"正在缓冲";

    

    

    NSString * ip = @"http://180.173.63.69:8081/api/";

    NSString * urlStr = [NSString stringWithFormat:@"%@%@",ip,@"getPubInfoWithPage"];

    

    //后台设定了每页15条数据,就不需要传入这个参数了

    NSDictionary * patameter = @{

                                 @"page" : [NSString stringWithFormat:@"%@",@(_pageNumber)]

                                 };

    

    AFHTTPSessionManager * manaager = [AFHTTPSessionManager manager];

    

    [manaager POST:urlStr parameters:patameter progress:^(NSProgress * _Nonnull uploadProgress) {

        

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        

        // 隐藏缓冲视图

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

        

        //数据处理

        NSInteger errorCode  =  [responseObject[@"errorCode"] integerValue];

        

        if (errorCode == 0)

        {

            

            //如果是一页的话,就移除所有的数据,刷新页面,只显示第一次的数据. 如果不是一页就一直加载数据.

            if (pageNumber == 1)

            {

                [self.dataSourse removeAllObjects];

            }

        

            

            NSArray * result = responseObject[@"result"];

            

            //网络请求成功,但是没有数据的情况

            if (result.count == 0)

            {

                _pageNumber --;

            }

            

            for (NSDictionary * dict in result)

            {

                

                Model * model = [[Model alloc] init];

                [model setValuesForKeysWithDictionary:dict];

                

                [self.dataSourse addObject:model];

            }

        }

        //没有请求到数据,说明到了最后一页

        else

        {

            _pageNumber --;

            

            UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示信息" message:@"已经到了最后一页了" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

            [alertView show];

        }

        

        [self.tableView reloadData];

        [_headerView endRefreshing];

        [_footerView endRefreshing];

    }

    failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)

    {

        _pageNumber --;

        

        [_headerView endRefreshing];

        [_footerView endRefreshing];

        

        // 隐藏缓冲视图

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

    }];

}

 

 

#pragma mark - UITableView 的 Delegate & DataSourse

 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.dataSourse.count;

}

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString * identifier = @"cell";

    

    Cell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    

    if (!cell)

    {

        cell = [[Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

    }

    

    cell.model = self.dataSourse[indexPath.row];

    

    return cell;

}

 

#pragma mark - 刷新视图的代理方法

- (void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView

{

    //下拉刷新

    if (refreshView == _headerView)

    {

        _pageNumber = 1;

        [self sendNetWorkingWithPage:1];

    }

    //上拉加载

    else if (refreshView == _footerView)

    {

        _pageNumber ++;

        [self sendNetWorkingWithPage:_pageNumber];

    }

}

 

@end

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!