移动应用开发中有这么一种场景,就是在列表中显示的数据刷新,有点击刷新按钮刷新的,也有现在最流行的由Twitter首先推出的下拉刷新功能,在IOS中,使用下拉刷新更新UITableView中的数据也用的非常多,最典型的就是新浪微博的客户端,使用下拉的形式来更新最新的微博信息。

在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的协议,接下来上代码,代码中有详细的注释说明。

  1. <span style="font-family:Comic Sans MS;font-size:18px;">#import <UIKit/UIKit.h>
  2. #import "EGORefreshTableHeaderView.h"
  3. @interface MainViewController : UITableViewController<UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>
  4. {
  5. EGORefreshTableHeaderView *_refreshTableView;
  6. BOOL _reloading;
  7. }
  8. @property (strong,nonatomic) NSArray *array;
  9. //开始重新加载时调用的方法
  10. - (void)reloadTableViewDataSource;
  11. //完成加载时调用的方法
  12. - (void)doneLoadingTableViewData;
  13. @end</span>
  1. #import "MainViewController.h"
  2. @interface MainViewController ()
  3. @end
  4. @implementation MainViewController
  5. @synthesize array = _array;
  6. #pragma mark -
  7. #pragma mark View life cycle
  8. -(void)viewDidLoad
  9. {
  10. [super viewDidLoad];
  11. //设置导航条标题
  12. self.navigationItem.title = @"Pull Refresh";
  13. if (_refreshTableView == nil) {
  14. //初始化下拉刷新控件
  15. 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)];
  16. refreshView.delegate = self;
  17. //将下拉刷新控件作为子控件添加到UITableView中
  18. [self.tableView addSubview:refreshView];
  19. _refreshTableView = refreshView;
  20. }
  21. //初始化用于填充表格的数据
  22. NSArray *dataArray = [NSArray arrayWithObjects:@"Ryan",@"Vivi", nil];
  23. self.array = dataArray;
  24. //重新加载表格数据
  25. [self.tableView reloadData];
  26. }
  27. -(void)viewDidUnload
  28. {
  29. [super viewDidUnload];
  30. _refreshTableView = nil;
  31. }
  32. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  33. {
  34. return (interfaceOrientation == UIInterfaceOrientationPortrait);
  35. }
  36. # pragma mark -
  37. # pragma mark UITableViewDataSource Methods
  38. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  39. {
  40. return 10;
  41. }
  42. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  43. {
  44. return [self.array count];
  45. }
  46. //带头标题的表格设置标题方法
  47. -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  48. {
  49. return [NSString stringWithFormat:@"Title %d",section + 1];
  50. }
  51. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  52. {
  53. static NSString *CellIdentifier = @"CellIdentifier";
  54. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  55. if (!cell) {
  56. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  57. }
  58. cell.textLabel.text = [self.array objectAtIndex:indexPath.row];
  59. return cell;
  60. }
  61. #pragma mark -
  62. #pragma mark Data Source Loading / Reloading Methods
  63. //开始重新加载时调用的方法
  64. - (void)reloadTableViewDataSource{
  65. _reloading = YES;
  66. //开始刷新后执行后台线程,在此之前可以开启HUD或其他对UI进行阻塞
  67. [NSThread detachNewThreadSelector:@selector(doInBackground) toTarget:self withObject:nil];
  68. }
  69. //完成加载时调用的方法
  70. - (void)doneLoadingTableViewData{
  71. NSLog(@"doneLoadingTableViewData");
  72. _reloading = NO;
  73. [_refreshTableView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
  74. //刷新表格内容
  75. [self.tableView reloadData];
  76. }
  77. #pragma mark -
  78. #pragma mark Background operation
  79. //这个方法运行于子线程中,完成获取刷新数据的操作
  80. -(void)doInBackground
  81. {
  82. NSLog(@"doInBackground");
  83. NSArray *dataArray2 = [NSArray arrayWithObjects:@"Ryan2",@"Vivi2", nil];
  84. self.array = dataArray2;
  85. [NSThread sleepForTimeInterval:3];
  86. //后台操作线程执行完后,到主线程更新UI
  87. [self performSelectorOnMainThread:@selector(doneLoadingTableViewData) withObject:nil waitUntilDone:YES];
  88. }
  89. #pragma mark -
  90. #pragma mark EGORefreshTableHeaderDelegate Methods
  91. //下拉被触发调用的委托方法
  92. -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
  93. {
  94. [self reloadTableViewDataSource];
  95. }
  96. //返回当前是刷新还是无刷新状态
  97. -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view
  98. {
  99. return _reloading;
  100. }
  101. //返回刷新时间的回调方法
  102. -(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view
  103. {
  104. return [NSDate date];
  105. }
  106. #pragma mark -
  107. #pragma mark UIScrollViewDelegate Methods
  108. //滚动控件的委托方法
  109. -(void)scrollViewDidScroll:(UIScrollView *)scrollView
  110. {
  111. [_refreshTableView egoRefreshScrollViewDidScroll:scrollView];
  112. }
  113. -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
  114. {
  115. [_refreshTableView egoRefreshScrollViewDidEndDragging:scrollView];
  116. }
  117. @end

IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新的更多相关文章

  1. android 项目学习随笔十一(ListView下拉刷新提示)

    1. 设置mHeaderView.setPadding TOPPADING为负值,隐藏刷新提示头布局 在onTouchEvent事件中进行头布局显示隐藏切换 import java.text.Simp ...

  2. IOS怎么实现一个UITableView的下拉刷新

    採用的EGORefreshTableHeaderView来实现: 在Controller上实现EGORefreshTableHeaderDelegate的delegate @property(nona ...

  3. JS学习笔记 - fgm练习 - 输入法下拉框 三元表达式

    <script> window.onload = function() { var oBtn = document.getElementsByTagName('input')[0]; va ...

  4. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

  5. Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现

    PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现...   不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...

  6. 如何写一套下拉刷新的控件?《MJRefresh原理浅析》(附Demo下载地址)

    相信大家有很多人在做项目的时候都在使用MJRefresh 控件来实现下拉刷新的功能: MJRefresh经过不断的重构与更新迭代,现在不管是功能上还是代码结构上都是相当不错的,都是很值我们去学习的. ...

  7. Android零基础入门第72节:SwipeRefreshLayout下拉刷新

    在实际开发中,经常都会遇到下拉刷新.上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件. 一.SwipeRefreshLayout简介 Swip ...

  8. 使用SVPullToRefresh实现下拉刷新和下拉加载

    移动端开发中,“下拉刷新”和“上拉加载更多”早已在各大App中随处可见.也非常容易就能找到直接可供使用的第三方资源.譬如EGOTableViewPullRefresh(下拉刷新)和LoadMoreTa ...

  9. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)

    最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...

随机推荐

  1. centos6服务器YUM安装LNMP(LINUX+NGINX+MYSQL+PHP)

    之前都用的lamp,这次配置一个lnmp来看看,试试Nginx是不是好用 关闭SELINUXvi /etc/selinux/config#SELINUX=enforcing #注释掉#SELINUXT ...

  2. ubuntu14.04纯命令行下连接有线网和无线网

    在ubuntu下网络管理器Network Manager莫名奇妙出现无法连接无线网的情况,于是昨天就开始着手解决这一问题: 一 :卸载 1.第一步卸载Network-Manager (具体字母的大小写 ...

  3. What are the advantages of ReLU over sigmoid function in deep neural network?

    The state of the art of non-linearity is to use ReLU instead of sigmoid function in deep neural netw ...

  4. Flex 学习笔记 ComboBox内容框宽度

    如何设置ComboBox下拉选项框的宽度呢 左边下拉框发现字符太长了   属性里也找不到相关宽度可以设置,解决如下 <!--添加open事件 打开下拉选项框时设置--> <s:Com ...

  5. Shell脚本查看apk签名信息

    用shell写了一个查看apk签名的脚本.代码很少也很简单 支持递归目录查询 #!/bin/bash #使用方法 ./getcertificate.sh xx.apk get_signature() ...

  6. java易错基础知识点

    一. Switch 1.其能接受的数据类型有四个,char , byte, short, int2.Default 可放在switch中的任何一个地方,但只有给定的条件匹配不到时,才会执行3.Case ...

  7. 理解RxJava线程模型

    RxJava作为目前一款超火的框架,它便捷的线程切换一直被人们津津乐道,本文从源码的角度,来对RxJava的线程模型做一次深入理解.(注:本文的多处代码都并非原本的RxJava的源码,而是用来说明逻辑 ...

  8. Creating Materials at runtime And Issue of Shader.Find()

    Creating Materials at runtimehttp://forum.unity3d.com/threads/create-materials-at-runtime.72952/ //通 ...

  9. 转linq中的Single()、First()、Take(1) LINQ 标准的查询操作符 排序 orderby、thenby、Take

    Single():操作一个集合,同时强要求只有一个对象匹配,并返回这一个. First():操作一个集合,可以有多个对象匹配,但是只返回第一个. Take(1):操作一个集合,可以有对个对象匹配,单只 ...

  10. “LC.exe”已退出,代码为 -1

    造成这个问题的原因一般是引入了第三方插件,自己遇到的问题是引入了devexpress...... 1.找到Properties文件夹licenses.licx文件,然后右键选择删除就可以了,调试运行正 ...