IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新
在Android开发中,有相应的开源项目来实现下拉刷新,这里主要讲如何在IOS中实现下拉刷新的功能,我们用到一个EGOTableViewPullRefresh的开源项目来实现这个功能,收先到这里下载源码,下载完成后里面有个Demo是可以直接运行的Xcode工程,然后就是这个开源项目的源码,学习如何使用可以参照Demo,我以下实现的这个是在Demo的基础上进行了一定的修改,主要是支持了中英文版本,原生的只支持英文,我添加了中英文支持,然后就是刷新时间的格式,修改后的格式更直观,原生的是使用SDK自带的时间格式,而我改成了自定义的形式。
首先来看看工程目录结构:

加载源码到工程中的方式我就不赘述了,然后我新建了一个MainViewController来作为主界面控制器,配有相应的xib文件。EGOTableViewPullRefresh文件夹下是开源项目的源码,Supporting Files分组下的Localizable.strings是做国际化的文件,支持中英文,这个文件就是支持下拉刷新中英文显示的国际化资源文件。
国际化是指随着手机语言的切换,软件的文字语言也随着切换,我这里只支持中英文,所以只建了一个English和一个Chinese的文件。关于如何在IOS中使用国际化,首先在工程中新建文件,选择Resouces然后选择Strings File类型的文件,创建成功后,选中该文件,在右边属性选择器中添加语言支持,如下图:

点击+号选择相应的语言就行,完成后就出现了两个子文件,分别对应中文和英文,在这些文件里面是以键值对的方式来标示需要国际化的内容:
英文:
"loading" = "Loading...";
中文:
"loading" = "加载中...";
左边是键,右边是值,注意一定要以“分号”结尾,否则无法识别该键值对。
在代码中的使用方式:
NSString *loadingString = NSLocalizedString(@"loading", @"");
第一个参数是获取内容的键,第二个是如果找不到该键对应的值,则取第二个参数对应的默认值。
在Android中,也是使用两个strings.xml文件来进行国际化,相比Android,IOS中国际化文件要精简些。
接下来就看如何使用该下拉刷新的开源项目,先看看最后实现的效果:


打开MainViewController.xib文件然后拖入一个UITableViewController并连接DataSource和Delegate,然后在MainViewController.h文件中声明UITableView的协议,接下来上代码,代码中有详细的注释说明。
- <span style="font-family:Comic Sans MS;font-size:18px;">#import <UIKit/UIKit.h>
- #import "EGORefreshTableHeaderView.h"
- @interface MainViewController : UITableViewController<UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>
- {
- EGORefreshTableHeaderView *_refreshTableView;
- BOOL _reloading;
- }
- @property (strong,nonatomic) NSArray *array;
- //开始重新加载时调用的方法
- - (void)reloadTableViewDataSource;
- //完成加载时调用的方法
- - (void)doneLoadingTableViewData;
- @end</span>
- #import "MainViewController.h"
- @interface MainViewController ()
- @end
- @implementation MainViewController
- @synthesize array = _array;
- #pragma mark -
- #pragma mark View life cycle
- -(void)viewDidLoad
- {
- [super viewDidLoad];
- //设置导航条标题
- self.navigationItem.title = @"Pull Refresh";
- if (_refreshTableView == nil) {
- //初始化下拉刷新控件
- EGORefreshTableHeaderView *refreshView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
- refreshView.delegate = self;
- //将下拉刷新控件作为子控件添加到UITableView中
- [self.tableView addSubview:refreshView];
- _refreshTableView = refreshView;
- }
- //初始化用于填充表格的数据
- NSArray *dataArray = [NSArray arrayWithObjects:@"Ryan",@"Vivi", nil];
- self.array = dataArray;
- //重新加载表格数据
- [self.tableView reloadData];
- }
- -(void)viewDidUnload
- {
- [super viewDidUnload];
- _refreshTableView = nil;
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
- }
- # pragma mark -
- # pragma mark UITableViewDataSource Methods
- -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return 10;
- }
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return [self.array count];
- }
- //带头标题的表格设置标题方法
- -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
- {
- return [NSString stringWithFormat:@"Title %d",section + 1];
- }
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- static NSString *CellIdentifier = @"CellIdentifier";
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- if (!cell) {
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
- }
- cell.textLabel.text = [self.array objectAtIndex:indexPath.row];
- return cell;
- }
- #pragma mark -
- #pragma mark Data Source Loading / Reloading Methods
- //开始重新加载时调用的方法
- - (void)reloadTableViewDataSource{
- _reloading = YES;
- //开始刷新后执行后台线程,在此之前可以开启HUD或其他对UI进行阻塞
- [NSThread detachNewThreadSelector:@selector(doInBackground) toTarget:self withObject:nil];
- }
- //完成加载时调用的方法
- - (void)doneLoadingTableViewData{
- NSLog(@"doneLoadingTableViewData");
- _reloading = NO;
- [_refreshTableView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
- //刷新表格内容
- [self.tableView reloadData];
- }
- #pragma mark -
- #pragma mark Background operation
- //这个方法运行于子线程中,完成获取刷新数据的操作
- -(void)doInBackground
- {
- NSLog(@"doInBackground");
- NSArray *dataArray2 = [NSArray arrayWithObjects:@"Ryan2",@"Vivi2", nil];
- self.array = dataArray2;
- [NSThread sleepForTimeInterval:3];
- //后台操作线程执行完后,到主线程更新UI
- [self performSelectorOnMainThread:@selector(doneLoadingTableViewData) withObject:nil waitUntilDone:YES];
- }
- #pragma mark -
- #pragma mark EGORefreshTableHeaderDelegate Methods
- //下拉被触发调用的委托方法
- -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
- {
- [self reloadTableViewDataSource];
- }
- //返回当前是刷新还是无刷新状态
- -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view
- {
- return _reloading;
- }
- //返回刷新时间的回调方法
- -(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view
- {
- return [NSDate date];
- }
- #pragma mark -
- #pragma mark UIScrollViewDelegate Methods
- //滚动控件的委托方法
- -(void)scrollViewDidScroll:(UIScrollView *)scrollView
- {
- [_refreshTableView egoRefreshScrollViewDidScroll:scrollView];
- }
- -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- {
- [_refreshTableView egoRefreshScrollViewDidEndDragging:scrollView];
- }
- @end
IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新的更多相关文章
- android 项目学习随笔十一(ListView下拉刷新提示)
1. 设置mHeaderView.setPadding TOPPADING为负值,隐藏刷新提示头布局 在onTouchEvent事件中进行头布局显示隐藏切换 import java.text.Simp ...
- IOS怎么实现一个UITableView的下拉刷新
採用的EGORefreshTableHeaderView来实现: 在Controller上实现EGORefreshTableHeaderDelegate的delegate @property(nona ...
- JS学习笔记 - fgm练习 - 输入法下拉框 三元表达式
<script> window.onload = function() { var oBtn = document.getElementsByTagName('input')[0]; va ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现
PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现... 不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...
- 如何写一套下拉刷新的控件?《MJRefresh原理浅析》(附Demo下载地址)
相信大家有很多人在做项目的时候都在使用MJRefresh 控件来实现下拉刷新的功能: MJRefresh经过不断的重构与更新迭代,现在不管是功能上还是代码结构上都是相当不错的,都是很值我们去学习的. ...
- Android零基础入门第72节:SwipeRefreshLayout下拉刷新
在实际开发中,经常都会遇到下拉刷新.上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件. 一.SwipeRefreshLayout简介 Swip ...
- 使用SVPullToRefresh实现下拉刷新和下拉加载
移动端开发中,“下拉刷新”和“上拉加载更多”早已在各大App中随处可见.也非常容易就能找到直接可供使用的第三方资源.譬如EGOTableViewPullRefresh(下拉刷新)和LoadMoreTa ...
- 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...
随机推荐
- Logistic回归模型和Python实现
回归分析是研究变量之间定量关系的一种统计学方法,具有广泛的应用. Logistic回归模型 线性回归 先从线性回归模型开始,线性回归是最基本的回归模型,它使用线性函数描述两个变量之间的关系,将连续或离 ...
- chain.doFilter(req, resp)
web中的Filiter过滤器: 当req不改变时,filiter在web中的配置和顺序没有关系: 但当在filiter中将其改变类型时,会导致其改变的request类型包装层次过多,无法获取其中的参 ...
- 手势抽取过程&代码复用
public abstract class BaseSetupActivity extends Activity { private GestureDetector gestureDetector; ...
- 火狐浏览器Firefox上DownThemAll插件
DownThemAll插件支持断点续传.多线程下载,可以大幅度提高下载速度. 在Windows平台上,要下载大量的文件,迅雷自然是首选:但在非Windows平台上,只要安装一个火狐浏览器,再安装Dow ...
- 转:C++中的单例模式
C++中的单例模式 单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块, ...
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- BZOJ2733 [HNOI2012]永无乡
直接平衡树启发式合并就好了...貌似是个很高端的东西.. 貌似可以证明splay的启发式合并是均摊$O(nlogn)$的...而其他平衡树都不行,所以其他的复杂度都是$O(nlog^2n)的$的 所以 ...
- Windows无法启动MySQL服务,错误 1053
解决方法: 正常重启电脑试试看,如果不行,在用下面试试 MYSQL 1053错误 解决方法: 在DOS命令行使用 第一步: 运行 -> cmd + 回车 (输入下面的命令) mysqld-nt ...
- jQuery 源码中的 camelCase
先看一下源码 //65-72行 // Matches dashed string for camelizing //匹配连字符 ‘-’ 和其后的第一个字母或数字,如果是字母,则替换为大写,如果是数字, ...
- Leetcode 155 Min Stack 小顶堆+栈,优先队列实现 难度:0
https://leetcode.com/problems/min-stack/ #include <vector> #include <queue> #include < ...