移动应用开发中有这么一种场景,就是在列表中显示的数据刷新,有点击刷新按钮刷新的,也有现在最流行的由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的协议,接下来上代码,代码中有详细的注释说明。

#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
#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

以上就实现了现在比较流行的下拉刷新功能,以上只是实现了一个现实需求中的框架,使用中根据业务需求添加功能就可以了。

转载自http://cache.baiducontent.com/c?m=9d78d513d9d431a94f999e690c66c0176d43f1632ba6d2020ca28449e3732a315015e3ac51200775d3d27d1716df4e4b9bf62173474573e7c59f9f4badffc97f6a9c60742e13dc0754910eaeb85b38917ecd0ffeaf6eb6fba66e84aea58f88124e8c00592fc0a7d758010×××fb64f60bdf1841e421943e1b37178fa52712a9d244a&p=b43ec45b86cc41a95db8c7710f569f&newp=882a9543d38057eb43f5c7710f649f231610db2151d7d1103cc2d7538b&user=baidu&fm=sc&query=%B4%F8%CF%C2%C0%AD%CB%A2%D0%C2%B5%C4tableview&qid=&p1=8

转载于:https://blog.51cto.com/ios2013yoyo/1269428

EGOTableViewPullRefresh实现下拉刷新相关推荐

  1. iOS UITableView下拉刷新上拉加载更多EGOTableViewPullRefresh类库使用初级剑侠篇(欢迎提建议和分享遇到的问题)

    这篇文章说下:MJRefresh和  EGOTableViewPullRefresh 的使用方法最下面有原理说明,若有不对或者建议请评论指出,先谢谢了: 首先是英文原文和类库下载地址:https:// ...

  2. xml解析新浪新闻_客户端_下拉刷新

    关于选择哪种xml库解析http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-projec ...

  3. 微信小程序下拉刷新和上拉加载

    效果图 微信小程序实现下拉刷新和上拉加载有2中方法 1 用系统自带的 个人感觉特别简单 2 使用scroll-view  实现, scroll-view 里面有2个属性是滑动到顶部以及到底部如下 其实 ...

  4. android google 下拉刷新 csdn,android SwipeRefreshLayout google官方下拉刷新控件

    下拉刷新功能之前一直使用的是XlistView很方便我前面的博客有介绍 SwipeRefreshLayout是google官方推出的下拉刷新控件使用方法也比较简单 今天就来使用下SwipeRefres ...

  5. 使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)

    <template><div class="sg-page-body"><div class="sg-list"><v ...

  6. 微信小程序下拉刷新和上拉加载的实现

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 一: 下拉刷新 下拉刷新两个步骤就能实现. 1.在要实现下拉刷新的页面的json配置文件里面加上 &q ...

  7. 微信小程序订单页面下拉刷新上拉分页加载

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 效果图: 代码: json代码: {"enablePullDownRefresh" ...

  8. 20-flutter下拉刷新与上拉加载

    1 RefreshIndicator 下拉刷新控件 下拉刷新的时候会回调 onRefresh 方法 RefreshIndicator(onRefresh: _handleRefresh,child: ...

  9. refreshcontrol 实现下拉刷新的功能

    该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...

最新文章

  1. uiuc工程学院计算机,UIUC计算机工程专业排名2020年
  2. 技术正文 history命令添加时间---测试磁盘写入速度
  3. 腾讯财付通漏洞遭***利用 威胁QQ彩钻等付费用户
  4. 10.众里寻他千百度- Find命令和文件后缀
  5. matlab调用kmeans_Matlab中Kmeans函数的使用
  6. AD的命名规则 AD常用产品型号命名规则
  7. UnityShader11:纹理属性
  8. osgb转json_基于CAD平台的OSGB数据分级渲染的方法与流程
  9. Python索引 说明
  10. Scrum板与Kanban如何抉择?kxqmoznsc板与按照rlooie
  11. graphpad prism横坐标怎么设置不显示数值_graphpad,prism,符号显示有问题
  12. 写贺卡给毕业师姐怎么写计算机系的,师哥送下一届毕业的寄语
  13. 赠书 002丨文化改变脑,是玄学?
  14. 不愿意跟同事分享的强大办公软件,超超超超级好用
  15. u盘kali linux淘宝,爱了!3 个受欢迎的 U盘Linux 发行版|Linux 中国
  16. 130242014047-徐晓敏-实验一
  17. 使用c语言计算3阶行列式
  18. MySQL之——Linux单机启动多个MySQL实例(mysqld_multi )
  19. Revit插件管理器永久免费使用(插件隐藏)
  20. 抢火车票软件推荐哪个好?

热门文章

  1. Python操作数据库完成接口测试
  2. java里的stream,Java中的Stream
  3. b丅151组成的充电器电路_一文读懂uc3842组成的开关电源电路
  4. php curl post text,php – POST适用于Postman,但不适用于CURL
  5. MobileNetV2: Inverted Residuals and Linear Bottlenecks
  6. Modeling Deformable Objects from a Single Depth Camera
  7. 25留数及其应用(一)
  8. GL和DX中关于纹理操作(包括多重纹理)与混合的问题
  9. LabelSmoothing标签平滑
  10. softmax的简洁实现