iOS 下拉刷新

article/2025/10/26 17:58:47

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

[cpp]  view plain copy
  1. <span style="font-family:Comic Sans MS;font-size:18px;">#import <UIKit/UIKit.h>  
  2. #import "EGORefreshTableHeaderView.h"  
  3.   
  4. @interface MainViewController : UITableViewController<UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>  
  5. {  
  6.     EGORefreshTableHeaderView *_refreshTableView;  
  7.     BOOL _reloading;  
  8. }  
  9.   
  10. @property (strong,nonatomic) NSArray *array;  
  11.   
  12. //开始重新加载时调用的方法  
  13. - (void)reloadTableViewDataSource;  
  14. //完成加载时调用的方法  
  15. - (void)doneLoadingTableViewData;  
  16.   
  17. @end</span>  

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


http://chatgpt.dhexx.cn/article/pYejOrXv.shtml

相关文章

uniapp几种实现下拉刷新的方式

一.自带刷新 1.在pages.json 上进行定义 2.在页面上监听下拉动作进行需要的操作 ps&#xff1a;一定要手动停止刷新&#xff0c;否则会一直刷新 自带刷新的优点&#xff1a;相对稳定&#xff0c;写法相对简单 自带刷新的缺点&#xff1a;样式上固定的 所以不能满足全部人的需…

小程序下拉刷新的实现

小程序下拉刷新 1.使用onPullDownRefresh()这个方法来实现下拉刷新 例子如下&#xff1a; // 下拉刷新onPullDownRefresh: function () {wx.showNavigationBarLoading() //在标题栏中显示加载图标setTimeout(() > {wx.hideNavigationBarLoading(); //完成停止加载wx.stopP…

Android 下拉刷新实践

1. 手动实现一个下拉刷新功能。 2. 效果图&#xff1a; 3. view结构 4.实现思路 <com.luocc.tim.recycler.RefreshLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:orientation"vertical"><Tex…

【uniapp】页面下拉刷新

目录 一、全局 二、局部 1、一个页面一个下拉刷新 2、一个页面多个下拉刷新&#xff08;切换时滚动条回到顶部&#xff09; 3、一个页面多个下拉刷新&#xff08;切换时恢复滚动条位置&#xff09; 一、全局 修改pages.json的"enablePullDownRefresh": true, …

uniapp 下拉刷新

uniapp 下拉刷新&#xff08;全局&单页面&#xff09; 全局设置 在pages.json文件的globalStyle对象中开启enablePullDownRefresh属性 单页面 在pages.json文件中的pages数组中找到对应的页面&#xff0c;在对应页面的style属性中开启enablePullDownRefresh属性 下拉刷…

Android 下拉刷新框架实现

前段时间项目中用到了下拉刷新功能&#xff0c;之前在网上也找到过类似的demo&#xff0c;但这些demo的质量参差不齐&#xff0c;用户体验也不好&#xff0c;接口设计也不行。最张没办法&#xff0c;终于忍不了了&#xff0c;自己就写了一个下拉刷新的框架&#xff0c;这个框架…

Android中实现下拉刷新

需求&#xff1a;项目中的消息列表界面要求实现类似sina微博的下拉刷新&#xff1b; 思路&#xff1a;一般的消息列表为ListView类型&#xff0c;将list加载到adapter中&#xff0c;再将adapter加载到ListView中&#xff0c;从而实现消息列表的展示。而下拉刷新要求给消息列表…

微信小程序下拉刷新

一、如何设置微信小程序所有页面都可以下拉刷新呢&#xff1f; 1、在app.json的"window"中进行配置 &#xff08;1&#xff09;把"backgroundTextStyle":“light"改为"backgroundTextStyle”:“dark” &#xff08;2&#xff09;添加"enab…

下拉刷新上拉加载

目录 原理实现效果 原理 想必使用过微信开发工具的应该都接触过上拉加载下拉刷新配置。 原理呢就是通过根据当前刚开始触碰的屏幕垂直y轴距离和滑动时所触碰垂直y轴距离&#xff0c;从而来判断是上拉&#xff0c;下拉。 实现 使用的vue2 封装的组件&#xff0c;js大致思路是…

Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/9255575 最近项目中需要用到ListView下拉刷新的功能&#xff0c;一开始想图省事&#xff0c;在网上直接找一个现成的&#xff0c;可是尝试了网上多个版本的下拉刷新之后发现效果都不怎么理想。有些…

【Demo】教你实现下拉刷新

前言 第三方库很常见&#xff0c;我们开发需求的时候经常会用到下拉刷新组件&#xff0c;如果要我们自己实现下拉刷新该如何实现尼&#xff1f; 效果 实现原理 1、监听 touchstart事件记录初始startY 2、监听 touchmove事件 e.touches[0].pageY - startY得到 deltaY&#xf…

如何实现上拉加载,下拉刷新

答&#xff1a;下拉刷新和上拉加载这两种交互⽅式通常出现在移动端中 本质上等同于PC⽹⻚中的分⻚&#xff0c;只是交互形式不同 开源社区也有很多优秀的解决⽅案&#xff0c;如 iscroll 、 better-scroll 、 pulltorefresh.js 库等等 这些第三⽅库使⽤起来⾮常便捷 我们通…

jira使用教程管理项目

添加工作流 1.点击项目设置 2.点击工作流&#xff0c;然后点击切换方案 3.进入切换方案界面之后&#xff0c;点击工作流&#xff0c;然后点击添加工作流 4.输入工作流名称&#xff0c;点击添加 5.编辑工作流 可以导出工作流供别人使用 编辑之前添加的工作流 提交bug

今日记录:JIRA使用指南

JIRA流程与使用指南 学习总结&#xff1a; 什么是JIRA&#xff1f;为什么要用任务管理工具&#xff1f;JIRA基础流程 ① 什么是JIRA&#xff1f; JIRA是一个项目与事务管理工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪和敏捷管理等工作领…

JIRA-使用教程_概念

博客概要 JIRA是一个非常强大的项目与事务跟踪工具&#xff0c;博主在具体工作使用中对它爱不释手 &#xff0c;发现它功能全面、配置灵活、扩展丰富…反正优点一大堆&#xff01;好东西嘛就要拿出来&#xff0c;大家一起分享~本博文先简单介绍JIRA相关的基本信息。 文章目录 博…

Confluence+Jira使用

Jira过滤器的使用方式&#xff1a; project MCU AND issuetype 测试用例 AND component GPIO ORDER BY summary ASC实例&#xff1a;

jira使用教程 一(从官方文档理解)

JIRA官方说明 JIRA使用教程 blog QA: jira 如何关联到Gerrit Reviews JIRA Concepts - Issues Aim JIRA tracks issues, which can be bugs, feature requests, or any other tasks you want to track. JIRA可以跟踪问题&#xff0c;可以是bug、特性请求或任何其他你想跟踪…

JIRA-使用教程_问题单-新建

博客概要 简单分享新增并查看一个问题单的步骤~ 文章目录 博客概要《JIRA-使用教程》_总目录问题单-新建1.进入项目2.新建唤起3.填写新建弹窗4.查看问题 总结 《JIRA-使用教程》_总目录 文章超链接&#xff1a;https://blog.csdn.net/qq_41386332/article/details/108865809 …

项目管理工具——Jira使用和配置

摘要 链接&#xff1a;https://pan.baidu.com/s/1_PgOuOWsS1lnHIIyI0y4pA 提取码&#xff1a;v0dy 本博文将介绍在软件开发中的常用的软件管理工具。Jira是Atlassian公司出品的一款事务管理软件&#xff08;缺陷管理类的软件&#xff09;。无论是“需求”&#xff0c;还是“…

命令进入mysql创建jira_JIRA使用教程:连接数据库—MySQL_MySQL

本文主要介绍如何连接JIRA到mysql数据库。 首先 查看MySQL的版本是否支持&#xff0c;查阅 支持的平台 。 如果是转移JIRA到另一台服务器&#xff0c;先导出数据为XML备份&#xff0c;然后将旧数据库中的数据传输到新的数据库。 如果你打算用同一个MySQL服务器安装Confluence和…