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

上拉刷新

1、在TableView里,一打开软件,我们就调用下拉刷新事件。

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3.  
  4. // 集成刷新控件
  5. [self setupRefresh];
  6.  
  7. }
  8.  
  9. /**
  10. * 集成下拉刷新
  11. */
  12. -(void)setupRefresh
  13. {
  14. //1.添加刷新控件
  15. UIRefreshControl *control=[[UIRefreshControl alloc]init];
  16. [control addTarget:self action:@selector(refreshStateChange:) forControlEvents:UIControlEventValueChanged];
  17. [self.tableView addSubview:control];
  18.  
  19. //2.马上进入刷新状态,并不会触发UIControlEventValueChanged事件
  20. [control beginRefreshing];
  21.  
  22. // 3.加载数据
  23. [self refreshStateChange:control];
  24. }

2、接下来,我们就要实现 refreshStateChange 这个方法,在里面显示数据和关闭下拉刷新。

  1. /**
  2. * UIRefreshControl进入刷新状态:加载最新的数据
  3. */
  4. -(void)refreshStateChange:(UIRefreshControl *)control
  5. {
  6. // 3.发送请求
  7. AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
  8.  
  9. [mgr GET:@"https://api.weibo.com/2/statuses/public_timeline.json" parameters:nil success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject){
  10.  
  11. //1.获取数据,处理数据,传递数据给tableView,如:
  12.  
  13. // 将最新的微博数据,添加到总数组的最前面
  14. // NSRange range = NSMakeRange(0, newStatuses.count);
  15. // NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
  16. // [self.statuses insertObjects:newStatuses atIndexes:set];
  17.  
  18. //2.刷新表格
  19. [self.tableView reloadData];
  20.  
  21. // 3. 结束刷新
  22. [control endRefreshing];
  23.  
  24. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  25.  
  26. // 结束刷新刷新 ,为了避免网络加载失败,一直显示刷新状态的错误
  27. [control endRefreshing];
  28. }];
  29. }

上拉刷新

上拉刷新,一般用于分页请求,拉到底后,自动加载下一页。下面就拿加载新浪微博数据为例。

一、由于下载加载更多数据,是一个不变的布局控件,我们就用xib来实现。

HWLoadMoreFooter.h

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface HWLoadMoreFooter : UIView
  4. +(instancetype)footer;
  5. @end

HWLoadMoreFooter.m

  1. #import "HWLoadMoreFooter.h"
  2.  
  3. @implementation HWLoadMoreFooter
  4.  
  5. +(instancetype)footer
  6. {
  7. return [[[NSBundle mainBundle] loadNibNamed:@"HWLoadMoreFooter" owner:nil options:nil] lastObject];
  8. }
  9.  
  10. @end

接着,我们建立一个名为HWLoadMoreFooter的xib

接下来,需要设置下面三个地方:

接着在框里拖拉一个Label,设置Label为填充整个view

最后,点击下图红色框,Update Frames

xib建好之后,下面我们来实现上拉刷新的代码

二.实现代码。

1.在TabelView中加载时,先加载该控件

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3.  
  4. // 集成下拉刷新控件
  5. [self setupUpRefresh];
  6.  
  7. // 集成上拉刷新控件
  8. [self setupDownRefresh];
  9.  
  10. }

2.集成上拉刷新方法

  1. /**
  2. * 集成上拉刷新
  3. */
  4. -(void)setupDownRefresh
  5. {
  6. HWLoadMoreFooter *footer = [HWLoadMoreFooter footer];
  7. footer.hidden = YES;
  8. self.tableView.tableFooterView = footer;
  9. }

3.异步请求数据方法

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

4.实现scrollViewDidScroll

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

iOS下拉刷新和上拉刷新的更多相关文章

  1. IOS 开发下拉刷新和上拉加载更多

    IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh ( ...

  2. IOS UITableView下拉刷新和上拉加载功能的实现

    在IOS开发中UITableView是非常常用的一个功能,而在使用UITableView的时候我们经常要用到下拉刷新和上拉加载的功能,今天花时间实现了简单的UITableView的下拉刷新和上拉加载功 ...

  3. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  4. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

  5. iscroll.js 下拉刷新和上拉加载

    html代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  6. Android 使用PullToRefresh实现下拉刷新和上拉加载(ExpandableListView)

    PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的Vie ...

  7. 使用PullToRefresh实现下拉刷新和上拉加载

    使用PullToRefresh实现下拉刷新和上拉加载 分类: Android2013-12-20 15:51 78158人阅读 评论(91) 收藏 举报 Android下拉刷新上拉加载PullToRe ...

  8. 下拉刷新和上拉加载 Swift

    转载自:http://iyiming.me/blog/2015/07/05/custom-refresh-and-loading/ 关于下拉刷新和上拉加载,项目中一直使用MJRefresh(原先还用过 ...

  9. H5下拉刷新和上拉加载实现原理浅析

    前言 在移动端H5网页中,下拉刷新和上拉加载更多数据的交互方式出现频率很高,开源社区也有很多类似的解决方案,如iscroll,pulltorefresh.js库等.下面是对这两种常见交互基本实现原理的 ...

随机推荐

  1. 零基础读懂视频播放器控制原理——ffplay播放器源代码分析

    版权声明:本文由张坤原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/535574001486630869 来源:腾云阁 ht ...

  2. SSL & TLS & STARTTLS

    https://www.fastmail.com/help/technical/ssltlsstarttls.html SSL vs TLS vs STARTTLS There's often qui ...

  3. Cordova 3.3 开发环境搭建(视频)

    图文文章参见: http://www.cnblogs.com/mlzs/p/3332199.html 视频共享链接 百度:http://pan.baidu.com/s/1c0EHfqC

  4. C# 未能加载文件或程序集“mysql.data”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    报错信息: 在web.config中已经加了以下代码. <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-co ...

  5. 关于hp proliant sl210t服务器raid 1阵列配置

    hp proliant sl210t服务器,一般都会带有两个阵列卡 一个服务器自带的Dynamic Smart Array B120i RAID控制器,一个为Slot卡槽上的Smart Array P ...

  6. Log4net配置之Winform项目

    具体方法如下: 一.App.config配置 <?xml version="1.0" encoding="utf-8" ?> <configu ...

  7. slam学习资源

    从零开始学slam: http://blog.csdn.net/akunainiannian/article/details/45363731 史上最全的SLAM学习资料收集  http://www. ...

  8. HDU 2187 - 悼念512汶川大地震遇难同胞——老人是真饿了 - [大水题]

    讲真,这么水的题,我都不怎么好意思扔到博客上来,但是没办法啊,我总得证明一下今天上午我不是在寝室里瞎玩浪费掉的…… 思路就是,把米按单价从小到大排个序,便宜的买的越多越好,直到钱花光为止……我真的都不 ...

  9. python读取文件行号和内容的便捷方法

    处理数据时候,需要得到数据所在和行号,使用enumerate时便捷的方法: file = open('file.txt','r') for (num,value) in enumerate(file) ...

  10. pyAudio介绍

    概要 pyaudio有这么几个功能: - 提取特征 - 训练并且使用分类器 - 语音分割功能 - 内容关系可视化 python实现,好处有这么几个 - 适合做计算分析类型操作(编码少,效率不低) - ...