iOS上下拉刷新控件MJRefresh使用方法详解

发布时间 - 2026-01-10 23:21:24    点击率:

MJRefresh是一个好用的上下拉刷新的控件,github地址如下:https://github.com/CoderMJLee/MJRefresh很多app都使用这个控件,我们也来了解一下它的用法。下面主要是介绍在UITableView下的使用。


使用

在github上下载之后,将MJRefresh文件添加到项目中,并且在需要使用的文件上引入MJRefresh.h。然后在该文件的viewDidLoad方法中指定tableView的header和footer,如下:

#import "MJRefreshTableViewController.h"
#import "MJRefresh.h"

@interface MJRefreshTableViewController ()
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@end

@implementation MJRefreshTableViewController

- (void)viewDidLoad {
[super viewDidLoad];

__weak typeof(self) weakSelf = self;
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
 //刷新时候,需要执行的代码。一般是请求最新数据,请求成功之后,刷新列表
 [weakSelf loadNewData];
}];

self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
 //刷新时候,需要执行的代码。一般是请求更多数据,请求成功之后,刷新列表
 [weakSelf loadNoreData];
}];
}

/**
 请求获取最新的数据
 */
- (void)loadNewData {
NSLog(@"请求获取最新的数据");

//这里假设2秒之后获取到了最新的数据,刷新tableview,并且结束刷新控件的刷新状态
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 //刷新列表
 [weakSelf.tableView reloadData];
 //拿到当前的刷新控件,结束刷新状态
 [weakSelf.tableView.mj_header endRefreshing];
});
}

/**
 请求获取更多的数据
 */
- (void)loadNoreData {
NSLog(@"请求获取更多的数据");

//这里假设2秒之后获取到了更多的数据,刷新tableview,并且结束刷新控件的刷新状态
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 //刷新列表
 [weakSelf.tableView reloadData];
 //拿到当前的刷新控件,结束刷新状态
 [weakSelf.tableView.mj_footer endRefreshing];
});
}
@end

按照app的实际情况来说,loadNoreData 和 loadNewData方法应该是发送数据请求,而结束刷新控件的刷新状态应该是在请求失败或者请求成功的方法中调用。

如果是带动图的刷新控件的话,就直接替换在viewDidLoad中的写法即可。

- (void)viewDidLoad {
[super viewDidLoad];

__weak typeof(self) weakSelf = self;
MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];

[header setImages:idleImages forState:MJRefreshStateIdle];
[header setImages:pullingImages forState:MJRefreshStatePulling];
[header setImages:refreshingImages forState:MJRefreshStateRefreshing];

self.tableView.mj_header = header;
}

其中idleImages,pullingImages,refreshingImages是图片数组,分别对应普通闲置状态,松开就可以进行刷新的状态,正在刷新中的状态等的图片。注意,idleImages等图片数组存储的对象是UIImage。

如果只设置了refreshingImages,只要在刷新状态下显示图片,其他状态不显示图片。如果设置了idleImages或者pullingImages其中之一,所有状态下都显示设置的图片。
同理,设置底部带动画效果的footer:

- (void)viewDidLoad {
[super viewDidLoad];

MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(endRefreshing)];

[footer setImages:idleImages forState:MJRefreshStateIdle];
[footer setImages:pullingImages forState:MJRefreshStatePulling];
[footer setImages:refreshingImages forState:MJRefreshStateRefreshing];

self.tableView.mj_footer = footer;
}

PO一张效果图:

header.stateLabel.hidden = YES;
header.lastUpdatedTimeLabel.hidden = YES;

如果隐藏右边状态或者更新时间其中一行文字,则显示的一行文字会垂直居中,效果如下:

如果把右边的两行文字都隐藏了,只显示图片,则图片居中,效果如下:

如果觉得动画频率过快或者过低,可以修改MJRefresh以下位置。

使用以下方法还可以修改显示文字

[header setTitle:@"下拉刷新" forState:MJRefreshStateIdle];
[header setTitle:@"释放开始刷新哦~" forState:MJRefreshStatePulling];
[header setTitle:@"正在快马加鞭地刷新着呢" forState:MJRefreshStateRefreshing];

其他控件的用法

UICollectionView 和UIScrollView的用法与UITableView的用法一致,只需将上面所说的tableView.mj_header 改成 collectionView.mj_header 和 scrollView.mj_header 即可。例如:

self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
 //刷新时候,需要执行的代码。一般是请求最新数据,请求成功之后,刷新列表
 [weakSelf loadNewData];
}];
self.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
 //刷新时候,需要执行的代码。一般是请求最新数据,请求成功之后,刷新列表
 [weakSelf loadNewData];
}];

又因UIWebView 自带一个UIScrollView的属性,所以UIWebView也可以使用MJRefresh,用法如下:

self.webView.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
 //刷新时候,需要执行的代码。一般是请求最新数据,请求成功之后,刷新列表
 [weakSelf loadNewData];
}];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# iOS上下拉刷新控件MJRefresh  # iOS上下拉刷新控件  # iOS上拉下拉刷新  # iOS表视图之下拉刷新控件功能的实现方法  # iOS编写下拉刷新控件  # 详解iOS开发中UItableview控件的数据刷新功能的实现  # iOS下拉、上拉刷新控件的封装  # 是一个  # 是在  # 更新时间  # 状态下  # 快马加鞭  # 还可以  # 只需  # 只显示  # 可以使用  # 实际情况  # 自带  # 好用  # 过快  # 也来  # 该文件  # 使用这个  # 大家多多  # 两行  # 过低  # 就可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  如何快速查询网站的真实建站时间?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何用花生壳三步快速搭建专属网站?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  网站建设要注意的标准 促进网站用户好感度!  Python进程池调度策略_任务分发说明【指导】  油猴 教程,油猴搜脚本为什么会网页无法显示?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何在阿里云域名上完成建站全流程?  如何在建站之星绑定自定义域名?  详解Android中Activity的四大启动模式实验简述  香港服务器选型指南:免备案配置与高效建站方案解析  百度浏览器如何管理插件 百度浏览器插件管理方法  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何快速查询网址的建站时间与历史轨迹?  EditPlus中的正则表达式实战(6)  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel如何实现一对一模型关联?(Eloquent示例)  如何确认建站备案号应放置的具体位置?  Linux系统命令中screen命令详解  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  青岛网站建设如何选择本地服务器?  Android滚轮选择时间控件使用详解  Laravel如何实现多对多模型关联?(Eloquent教程)  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Java遍历集合的三种方式  canvas 画布在主流浏览器中的尺寸限制详细介绍  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  浅析上传头像示例及其注意事项  C++时间戳转换成日期时间的步骤和示例代码  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  免费视频制作网站,更新又快又好的免费电影网站?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何撰写建站申请书?关键要点有哪些?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  JavaScript常见的五种数组去重的方式