美文网首页
MJRefresh的二次封装扩展类

MJRefresh的二次封装扩展类

作者: Mina_小花猫 | 来源:发表于2020-04-28 15:19 被阅读0次

    参考:

    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
    
    

    相关文章

      网友评论

          本文标题:MJRefresh的二次封装扩展类

          本文链接:https://www.haomeiwen.com/subject/libvwhtx.html