对上拉刷新, 下拉加载, 进行封装, 包括2种 :
(一) 自定义静态
上拉刷新, 下拉加载封装
写一个类, 继承自 MJRefreshNormalHeader
@implementation RefreshHeader
/* 初始化 */
- (void)prepare
{
[super prepare];
self.automaticallyChangeAlpha = YES;
self.lastUpdatedTimeLabel.textColor = [UIColor orangeColor];
self.stateLabel.textColor = [UIColor orangeColor];
[self setTitle:@"赶紧下拉吧" forState:MJRefreshStateIdle]; //setValue 方法, 根据不同状态设置不同的文字
[self setTitle:@"赶紧松开吧" forState:MJRefreshStatePulling];
[self setTitle:@"正在加载数据..." forState:MJRefreshStateRefreshing];
// self.lastUpdatedTimeLabel.hidden = YES;
// self.stateLabel.hidden = YES;
[self addSubview:[[UISwitch alloc] init]];
UIImageView *logo = [[UIImageView alloc] init];
logo.image = [UIImage imageNamed:@"bd_logo1"];
[self addSubview:logo];
self.logo = logo;
}
/**
* 摆放子控件 : 加一个公司的图片Logo
*/
- (void)placeSubviews
{
[super placeSubviews];
self.logo.xmg_width = self.xmg_width;
self.logo.xmg_height = 50;
self.logo.xmg_x = 0;
self.logo.xmg_y = - 50;
}
@end
在ViewController中, 设置 tableView 的 mj_header
和 mj_footer
- (void)setupRefresh
{ self.tableView.mj_header = [RefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
// 一进来就刷新
[self.tableView.mj_header beginRefreshing];
// 尾视图的
self.tableView.mj_footer = [RefreshFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
}
#pragma mark - 加载新数据
- (void)loadNewData{
}
#pragma mark - 加载更多数据
- (void)loadMoreData{
}
注意 : 在加载完数据或者网络请求失败的时候, 需要结束刷新
结束下拉刷新
[self.tableView.mj_header endRefreshing];
结束上拉加载
[self.tableView.mj_footer endRefreshing];
(二) 自定义 动态
的上拉刷新, 下拉加载封装
自定义上拉加载控件, 写一个类, 继承自 MJRefreshBackGifFooter
#import "RefreshFooter.h"
@interface RefreshFooter ()
@property (nonatomic, strong) NSMutableArray *footerArr1;
@property (nonatomic, strong) NSMutableArray *footerArr2;
@end
@implementation RefreshFooter
- (void)prepare {
[super prepare];
self.stateLabel.hidden = YES;
for (int i = 6; i >= 1; i--) {
NSString *imageName = [NSString stringWithFormat:@"刷新%d",i];
UIImage *image = [UIImage imageNamed:imageName];
[self.footerArr1 addObject:image];
}
for (int i = 1; i<= 8; i++) {
NSString *iamgeName = [NSString stringWithFormat:@"loading%d",i];
UIImage *image = [UIImage imageNamed:iamgeName];
[self.footerArr2 addObject:image];
}
[self setImages:self.footerArr1 forState:MJRefreshStateIdle];
[self setImages:self.footerArr2 forState:MJRefreshStatePulling];
[self setImages:self.footerArr2 forState:MJRefreshStateRefreshing];
}
- (NSMutableArray *)footerArr1 {
if (_footerArr1 == nil) {
_footerArr1 = [NSMutableArray new];
}
return _footerArr1;
}
- (NSMutableArray *)footerArr2 {
if (_footerArr2 == nil) {
_footerArr2 = [NSMutableArray new];
}
return _footerArr2;
}
@end
在BaseViewController 中, 需要封装一个setRefrshMJFooterView
方法, 让子类直接调用父类的方法即可 [或者这2部分, 合并成一部分, 如上, 写在需要刷新控件的ViewController中]
/**
* 设置刷新尾
* @return
*/
- (RefreshFooter *)setRefrshMJFooterView;
- (RefreshFooter *)setRefrshMJFooterView {
RefreshFooter *footer = [RefreshFooter footerWithRefreshingTarget:self refreshingAction:@selector(LoadMoreDate)];
return footer;
}
在子类ViewController中, 调用上面的方法
self.tableView.mj_header = [self setRefrshMJHeaderView];
self.tableView.mj_footer = [self setRefrshMJFooterView];
[self.tableView.mj_header beginRefreshing];//设置进入页面,自动刷新
注意 : 过程中, 在 [self setRefrshMJHeaderView]
的时候, 出现了⚠️, 是因为 没有正确引用 自定义类的头文件