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
iOS-上拉刷新,下拉加载-----------详解的更多相关文章
- Flutter学习笔记(25)--ListView实现上拉刷新下拉加载
如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...
- jQuery模拟原生态App上拉刷新下拉加载
jQuery模拟原生态App上拉刷新下拉加载效果代码,鼠标上拉时会显示loading字样,并且会模拟加载一条静态数据,支持触屏设备使用. <!doctype html> <html ...
- Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载
随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...
- 微信小程序 上拉刷新/下拉加载
小程序项目中上拉刷新下拉加载是比较常见的需求,官方文档也提供了相当友好的API,但是因为API隐藏的比较深,文档描述也比较模糊所以也折腾了一番(官方文档),在此记录一下使用方式 onPullDownR ...
- ListView上拉刷新和分页加载完整的Dome
很多人工作的过程中都会碰到ListView下拉刷新和分页加载,然后大多数公司都已经把框架写好了,大家直接用就可以了,有些人一直对这个事情处于迷茫状态,为了让大家对上拉刷新和分页加载有一个比较全面的认识 ...
- jQuery WeUI 组件下拉刷新和滚动加载的实现
最近在做手机版使用到了下拉刷新和滚动加载,记录一下实现过程: 一.引入文件 ? 1 2 3 4 <link rel="stylesheet" href="Conte ...
- Javascript 异步加载详解
Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...
- 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23698511 今天继续对我们的csdn客户端未完成的功能进行实现,本篇博客接着客 ...
- XRecyclerView上拉刷新下拉加载
效果图: 首先要添加依赖: //xrecyclerviewimplementation 'com.jcodecraeer:xrecyclerview:1.3.2'//Gsonimplementatio ...
- iOS:延迟加载和上拉刷新/下拉加载的实现
lazy懒加载(延迟加载)UITableView 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要 ...
随机推荐
- 软件设计之UML—UML中的六大关系
一.UML中的六大关系 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation), ...
- Django抛错不存在(DoesNotExist)
from django.core.exceptions import ObjectDoesNotExist try: disabledusers.objects.get(sAMAccountName= ...
- Sqlte数据库
1. 收缩数据库. 指令:VACUUM
- 用thinkphp将网络上的图片下载到本地服务器
我用的thinkphp版本是3.2.3,这个版本的跟更早些版本的调用方法不太一样,正确的调用方法是: Demo3Controller.class <?php namespace Home\Con ...
- Logstash——multiline 插件,匹配多行日志
本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...
- 国内市场上 Android 手机屏幕分辨率的比例情况如何?
http://www.zhihu.com/question/19587205 根据友盟发布的<友盟国内Android数据报告>,前六名分别是: 800×480,32.4% 480×320, ...
- Scala深入浅出实战经典之 List伴生对象操作方法代码实战.
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Chapter 5. Graph Theory:: Fundamentals:: Intermediate
10457 - Magic Car 题意一开始看起来有点费解,其实最后就是要起点到终点的路径上最大边与最小边之差越小越好.这样我们可以先将边排个序,然后枚举路径上的最小边,之后依次将比它大的边按升序的 ...
- Xiph基金会成员:Timothy B. Terriberry
Speex,CELT,Opus的发明人之一 还特意写了高中:Thomas Jefferson High School for Science and Technology Shit 一查,全美第一名的 ...
- Entity Framework: Joining in memory data with DbSet
转载自:https://ilmatte.wordpress.com/2013/01/06/entity-framework-joining-in-memory-data-with-dbset/ The ...