zoukankan      html  css  js  c++  java
  • iOS-上拉刷新,下拉加载-----------详解

    一.使用的第三方库

    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

    你的一次推荐就是对我莫大的支持。感觉不错,给个推荐或者评论吧。
  • 相关阅读:
    抽卡 状压DP+期望DP+系数递推
    20190903考试反思
    20190823考试反思
    约瑟夫类问题研究
    树位DP
    20190823考试反思
    20190820考试反思
    20190818考试反思
    20190817考试反思
    PowerBuilder--Aes128加解密
  • 原文地址:https://www.cnblogs.com/mancong/p/5394870.html
Copyright © 2011-2022 走看看