一.使用的第三方库

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

iOS-上拉刷新,下拉加载-----------详解的更多相关文章

  1. Flutter学习笔记(25)--ListView实现上拉刷新下拉加载

    如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...

  2. jQuery模拟原生态App上拉刷新下拉加载

    jQuery模拟原生态App上拉刷新下拉加载效果代码,鼠标上拉时会显示loading字样,并且会模拟加载一条静态数据,支持触屏设备使用. <!doctype html> <html ...

  3. Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

    随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...

  4. 微信小程序 上拉刷新/下拉加载

    小程序项目中上拉刷新下拉加载是比较常见的需求,官方文档也提供了相当友好的API,但是因为API隐藏的比较深,文档描述也比较模糊所以也折腾了一番(官方文档),在此记录一下使用方式 onPullDownR ...

  5. ListView上拉刷新和分页加载完整的Dome

    很多人工作的过程中都会碰到ListView下拉刷新和分页加载,然后大多数公司都已经把框架写好了,大家直接用就可以了,有些人一直对这个事情处于迷茫状态,为了让大家对上拉刷新和分页加载有一个比较全面的认识 ...

  6. jQuery WeUI 组件下拉刷新和滚动加载的实现

    最近在做手机版使用到了下拉刷新和滚动加载,记录一下实现过程: 一.引入文件 ? 1 2 3 4 <link rel="stylesheet" href="Conte ...

  7. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  8. 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23698511 今天继续对我们的csdn客户端未完成的功能进行实现,本篇博客接着客 ...

  9. XRecyclerView上拉刷新下拉加载

    效果图: 首先要添加依赖: //xrecyclerviewimplementation 'com.jcodecraeer:xrecyclerview:1.3.2'//Gsonimplementatio ...

  10. iOS:延迟加载和上拉刷新/下拉加载的实现

    lazy懒加载(延迟加载)UITableView 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要 ...

随机推荐

  1. android: SQLite添加数据

    现在你已经掌握了创建和升级数据库的方法,接下来就该学习一下如何对表中的数据进 行操作了.其实我们可以对数据进行的操作也就无非四种,即 CRUD.其中 C 代表添加 (Create),R 代表查询(Re ...

  2. YChaos生成混沌图像

    YChaos是一款通过数学公式生成混沌图像的软件,展示混沌之美,数学之美.软件中定义一套简易的脚本语言,用于描述数学表达式.使用时需要先要将数学表达式写成该脚本的形式,解析脚本代码以生成相应的图形与图 ...

  3. 2014中国软件开发者调查(二):Java、.NET、Web、云计算特点

    继上周五放出第一篇中国软件开发者调查报告后,很多初学者和开发者翘首以盼第二篇.第三篇报告--希望这些调查报告能够给他们带来指导,解决他们的疑惑.确定他们的学习和使用信心.经过笔者在周末的努力,内容更加 ...

  4. Openresty 安装教程

    Openresty的简单安装方法,如需高级编译安装,请参照安装选项 1.安装配置好Yum源,不赘述此步骤 2.安装必要组件 yum install pcre-devel openssl-devel g ...

  5. Android--使用Canvas绘图

    前言 除了使用已有的图片之外,Android应用常常需要在运行时根据场景动态生成2D图片,比如手机游戏,这就需要借助于Android2D绘图的支持.本篇博客主要讲解一下Android下使用Canvas ...

  6. 关于VS2010出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用... ...请使用 NetFx40_LegacySecurityPolicy 配置开关”解决办法

    有时候VS会出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用.若要出于兼容性原因而启用 CAS 策略,请使用 NetFx40_LegacySecurityPolicy 配置 ...

  7. ABAP报表中负值展示问题的处理方法

    现象描述 在使用ABAP报表展示数据的时候会涉及到金额类字段,在手动计算金额的时候,有时会发生存在负值而无法正常展示的情况.  处理过程 ABAP报表的数据展示常用的方法有两种,分别是表控制和ALV ...

  8. lua中常量的实现及表的深拷贝实现

    废话:好久没在这里写博客了...主要原因是我买了个域名hanxi.info并在github上搭建了个人博客... lua中默认是没有c中的const常量的,在csdn上找到了一个使用setmetata ...

  9. wordpress自动保存远程图片插件 DX-auto-save-images

    wordpress自动保存远程图片插件DX-auto-save-images 解决了保存文章就可以自动将远程图片保存到你的服务器上了. 具体操作步骤如下: 1.安装启用wordpress自动保存远程图 ...

  10. 2.C#自定义Attribute

    阅读目录    一:C#自定义Attribute    二:AttributeUsageAttribute中的3个属性(Property)中的AttributeTargets   三:Attribut ...