参考:
https://www.jianshu.com/p/ddbadb3c82cc
修改了一些方法。
修改刷新样式,在这两个方法修改,根据判断也可以添多个样式,比如动画样式
/**
@brief 下拉刷新
*/
- (void)headerWithRefreshingBlock:(void(^)(NSInteger pageIndex))refreshBlock
{
__weak typeof(self) weakSelf = self;
self.refreshBlock = refreshBlock;
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[weakSelf resetPageIndex];
if (weakSelf.refreshBlock) {
weakSelf.refreshBlock(weakSelf.pageIndex);
}
}];
self.mj_header = header;
}
/**
@brief 上拉加载
*/
- (void)footerWithRefreshingBlock:(void(^)(NSInteger pageIndex))loadMoreBlock
{
__weak typeof(self) weakSelf = self;
self.loadMoreBlock = loadMoreBlock;
MJRefreshBackNormalFooter *footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
//这里判断是防止pageIndex没有初始值
if (weakSelf.pageIndex == 0) {
[weakSelf resetPageIndex];
}
weakSelf.pageIndex += 1;
if (weakSelf.loadMoreBlock) {
weakSelf.loadMoreBlock(weakSelf.pageIndex);
}
}];
self.mj_footer = footer;
}
使用
添加刷新
[self.mainTableView headerWithRefreshingBlock:^(NSInteger pageIndex) {
[self getDataWithPage:pageIndex];
}];
[self.mainTableView footerWithRefreshingBlock:^(NSInteger pageIndex) {
[self getDataWithPage:pageIndex];
}];
处理请求完后停止
不管接口成功或失败都停止刷新(写在数据处理前面),在数据处理中,如果没有更多数据了,会调用没有更多数据的方法。
如果停止刷新的方法写在了数据处理后面,没有更多数据的方法会不成功,因为这些方法都是异步主线程执行的,状态不会立马更新,(之前是在没有更多数据的方法加了一个延迟执行,会后执行这个方法)
- (void)getDataWithPage:(NSInteger)page
{
[PublicRequest publicGetNewsWithpage:page pageSize:kPageSize SuccessBlock:^(BOOL isSuccess, NSDictionary * _Nonnull resultDictionary) {
///不管接口成功或失败都停止刷新(写在数据处理前面)
[self.mainTableView endHeaderRefresh];
[self.mainTableView endFooterRefresh];
if (isSuccess) {
if (page == kPageIndex) {
self.dataArray = [NSMutableArray array];
}
[resultDictionary[@"data"] enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NewsModel *model = [[NewsModel alloc] initWithDictionary:obj];
[self.dataArray addObject:model];
}];
[self.mainTableView reloadData];
if ([resultDictionary[@"data"] count] < kPageSize) {
///所有数据加载完毕,没有更多的数据了
[self.mainTableView endFooterNoMoreData];
}
}
}];
}
正常使用,普通结束刷新和没有更多数据只能执行一个。
- (void)getDataWithPage:(NSInteger)page
{
[PublicRequest publicGetNewsWithpage:page pageSize:kPageSize SuccessBlock:^(BOOL isSuccess, NSDictionary * _Nonnull resultDictionary) {
if (isSuccess) {
if (page == kPageIndex) {
self.dataArray = [NSMutableArray array];
}
[resultDictionary[@"data"] enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NewsModel *model = [[NewsModel alloc] initWithDictionary:obj];
[self.dataArray addObject:model];
}];
[self.mainTableView reloadData];
///结结束刷新,普通结束和没有数据结束
[self.mainTableView endFooterRefreshOrNoMoreData:[resultDictionary[@"data"] count]];
}else
{
[self.mainTableView endFooterRefresh];
}
///不管接口成功或失败都停止刷新
[self.mainTableView endHeaderRefresh];
}];
}
完整文件
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIScrollView (MJRefreshEX)
/**
@brief 下拉刷新
*/
- (void)headerWithRefreshingBlock:(void(^)(NSInteger pageIndex))refreshBlock;
/**
@brief 上拉加载
*/
- (void)footerWithRefreshingBlock:(void(^)(NSInteger pageIndex))loadMoreBlock;
/**
@brief 重置页数
*/
- (void)resetPageIndex;
/**
@brief 下拉结束刷新
*/
- (void)endHeaderRefresh;
/**
@brief 普通请求结束刷新
*/
- (void)endFooterRefresh;
/**
@brief 没有数据结束刷新
*/
- (void)endFooterNoMoreData;
/**
@brief 结束刷新,普通结束和没有数据结束
*/
- (void)endFooterRefreshOrNoMoreData:(NSInteger)dataCount;
@end
NS_ASSUME_NONNULL_END
#import "UIScrollView+MJRefreshEX.h"
#import <MJRefresh/MJRefresh.h>
#import <objc/runtime.h>
typedef void(^RefreshBlock)(NSInteger pageIndex);
typedef void(^LoadMoreBlock)(NSInteger pageIndex);
@interface UIScrollView()
/**页码*/
@property (assign, nonatomic) NSInteger pageIndex;
/**下拉时候触发的block*/
@property (nonatomic, copy) RefreshBlock refreshBlock;
/**上拉时候触发的block*/
@property (nonatomic, copy) LoadMoreBlock loadMoreBlock;
@end
@implementation UIScrollView (MJRefreshEX)
static void *pagaIndexKey = &pagaIndexKey;
- (void)setPageIndex:(NSInteger)pageIndex{
objc_setAssociatedObject(self, &pagaIndexKey, @(pageIndex), OBJC_ASSOCIATION_ASSIGN);
}
- (NSInteger)pageIndex
{
return [objc_getAssociatedObject(self, &pagaIndexKey) integerValue];
}
static void *RefreshBlockKey = &RefreshBlockKey;
- (void)setRefreshBlock:(void (^)(void))RefreshBlock{
objc_setAssociatedObject(self, &RefreshBlockKey, RefreshBlock, OBJC_ASSOCIATION_COPY);
}
- (RefreshBlock)refreshBlock
{
return objc_getAssociatedObject(self, &RefreshBlockKey);
}
static void *LoadMoreBlockKey = &LoadMoreBlockKey;
- (void)setLoadMoreBlock:(LoadMoreBlock)loadMoreBlock{
objc_setAssociatedObject(self, &LoadMoreBlockKey, loadMoreBlock, OBJC_ASSOCIATION_COPY);
}
- (LoadMoreBlock)loadMoreBlock
{
return objc_getAssociatedObject(self, &LoadMoreBlockKey);
}
/**
@brief 下拉刷新
*/
- (void)headerWithRefreshingBlock:(void(^)(NSInteger pageIndex))refreshBlock
{
__weak typeof(self) weakSelf = self;
self.refreshBlock = refreshBlock;
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[weakSelf resetPageIndex];
if (weakSelf.refreshBlock) {
weakSelf.refreshBlock(weakSelf.pageIndex);
}
}];
self.mj_header = header;
}
/**
@brief 上拉加载
*/
- (void)footerWithRefreshingBlock:(void(^)(NSInteger pageIndex))loadMoreBlock
{
__weak typeof(self) weakSelf = self;
self.loadMoreBlock = loadMoreBlock;
MJRefreshBackNormalFooter *footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
//这里判断是防止pageIndex没有初始值
if (weakSelf.pageIndex == 0) {
[weakSelf resetPageIndex];
}
weakSelf.pageIndex += 1;
if (weakSelf.loadMoreBlock) {
weakSelf.loadMoreBlock(weakSelf.pageIndex);
}
}];
self.mj_footer = footer;
}
#pragma mark - 重置页数
- (void)resetPageIndex {
self.pageIndex = kPageIndex;
}
#pragma mark - 结束下拉刷新
-(void)endHeaderRefresh {
if (self.mj_header.state == MJRefreshStateRefreshing) {
[self.mj_header endRefreshing];
[self.mj_footer resetNoMoreData];
}
}
/**
普通请求结束刷新
*/
-(void)endFooterRefresh {
if (self.mj_footer.state == MJRefreshStateRefreshing) {
[self.mj_footer endRefreshing];
}
}
/**
没有数据结束刷新
*/
- (void)endFooterNoMoreData
{
///所有数据加载完毕,没有更多的数据了
[self.mj_footer endRefreshingWithNoMoreData];
}
/**
@brief 结束刷新,普通结束和没有数据结束
*/
- (void)endFooterRefreshOrNoMoreData:(NSInteger)dataCount
{
///没有数据了
if (self.mj_footer.state == MJRefreshStateRefreshing) {
if (dataCount < kPageSize) {
///所有数据加载完毕,没有更多的数据了
[self.mj_footer endRefreshingWithNoMoreData];
}else
{
[self.mj_footer endRefreshing];
}
}
}
@end