iOS分頁-PageTableView

接口部分

@protocol UITableViewPageDelegate <NSObject>

@optional

/*
    下拉調(diào)用
 */
-(void)pullDownRefreshInTableView:(UITableView *_Nonnull)tableView;
/*
    上拉調(diào)用
 */
-(void)tableView:(UITableView *_Nonnull)tableView pullUpWithPage:(long)page;


@end


@interface PageTableView : UITableView


@property (nonatomic, weak) id<UITableViewPageDelegate> pageDelegate;

#pragma mark - 數(shù)據(jù)處理
/*
    allData,分頁請求的完整數(shù)據(jù)
 */
@property(nonatomic, strong, readonly) NSArray<id> *allData;
/*
    添加頁面數(shù)據(jù)
 */
-(void)addCurrentPageData:(NSArray<id> *)currentPageData;
/*
    用于判斷是否最后一頁
 */
-(void)upgradeCurrentPageCount:(long)currentPageCount;

#pragma mark - 下拉刷新
/*
    賦值給mj_header即可使用
 */
@property(nonatomic, strong, readonly) MJRefreshNormalHeader *normalHeader;

/*
    下拉刷新結束需要調(diào)用
 */
-(void)endPullDownRefresh;


#pragma mark - 上拉刷新
/*
    賦值給mj_footer即可使用
 */
@property(nonatomic, strong, readonly) MJRefreshAutoNormalFooter *normalFooter;

/*
    是否允許上拉
    默認不允許,為了良好的用戶體驗,第一頁數(shù)據(jù)加載出來之前不能進行上拉,當從第二頁開始的時候,會自動置為允許
 */
@property(nonatomic, assign) bool allowPullUp;

/*
    currentPage代表當前即將要請求的頁,即還未請求
 */
@property(nonatomic, assign, readonly) long currentPage;
@property(nonatomic, assign, readonly) bool lastPage;

/*
    設置pageSize可幫助判斷l(xiāng)astPage,與totalCount配合使用
 */
@property(nonatomic, assign) long pageSize;
/*
    支持設置兩種總數(shù)判斷,任選其一
 */
@property(nonatomic, assign) long totalPage;
@property(nonatomic, assign) long totalCount;

/*
    上拉加載結束需要調(diào)用
 */
-(void)endPullUpRefresh;

/*
    該操作會迭代下一頁
 */
-(void)goNextPage;

/*
    重置上拉刷新,同時會重置currentPage為1
 */
-(void)resetPullUpRefresh;


@end

實現(xiàn)部分

@interface PageTableView ()

@property(nonatomic, strong) NSMutableArray<id> *mutableArray;

@property(nonatomic, assign) long currentPageCount;

@end

@implementation PageTableView
{
    long _currentPage;
    MJRefreshNormalHeader *_normalHeader;
    MJRefreshAutoNormalFooter *_normalFooter;
}

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
{
    self = [super initWithFrame:frame style:style];
    if (self) {
        _currentPage = 1;
        self.currentPageCount = -1;
        self.pageSize = 0;
        self.totalPage = -1;
        self.totalCount = -1;
        self.allowPullUp = NO;
    }
    return self;
}

#pragma mark - 懶加載/setter/getter
- (MJRefreshNormalHeader *)normalHeader
{
    if (_normalHeader == nil) {
        _normalHeader = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(tableViewPullDownAction)];
        [_normalHeader setTitle:@"下拉進行更新" forState:MJRefreshStateIdle];
        [_normalHeader setTitle:@"松開立即更新" forState:MJRefreshStatePulling];
        [_normalHeader setTitle:@"更新中" forState:MJRefreshStateRefreshing];
        _normalHeader.lastUpdatedTimeLabel.hidden = YES;
    }
    return _normalHeader;
}
-(MJRefreshAutoNormalFooter *)normalFooter
{
    if (_normalFooter == nil) {
        _normalFooter = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(tableViewPullUpAction)];
        [_normalFooter setTitle:@"上拉加載更多" forState:MJRefreshStateIdle];
        [_normalFooter setTitle:@"加載中" forState:MJRefreshStateRefreshing];
        [_normalFooter setTitle:@"————  沒有更多信息了  ————" forState:MJRefreshStateNoMoreData];
        _normalFooter.stateLabel.textColor = [UIColor corlorWithR:200 G:200 B:200];
        
        //默認初始化不顯示
        _normalFooter.stateLabel.hidden = YES;
    }
    return _normalFooter;
}
-(NSArray<id> *)allData
{
    return [self.mutableArray copy];
}
-(NSMutableArray<id> *)mutableArray
{
    if (_mutableArray == nil) {
        _mutableArray = [NSMutableArray array];
    }
    return _mutableArray;
}
-(long)currentPage
{
    return _currentPage;
}
-(bool)lastPage
{
    if (self.pageSize > 0 && (self.currentPageCount >= 0 && self.currentPageCount < self.pageSize)) {
        return YES;
    }
    //優(yōu)先使用已加載數(shù)據(jù)判斷是否最后一頁(若已加載數(shù)據(jù)存在)
    if ((self.totalCount >= 0 && self.mutableArray.count > 0) && self.mutableArray.count >= self.totalCount) {
        return YES;
    }
    long lastLoadPage = self.currentPage - 1;
    if ((self.totalPage >= 0) && lastLoadPage >= self.totalPage) {
        return YES;
    }

    if ((self.totalCount >= 0 && self.pageSize > 0) && lastLoadPage * self.pageSize >= self.totalCount) {
        return YES;
    }

    return NO;
}
-(void)setAllowPullUp:(bool)allowPullUp
{
    _allowPullUp = allowPullUp;
    if (self.mj_footer && [self.mj_footer isKindOfClass:[MJRefreshAutoNormalFooter class]]) {
        MJRefreshAutoNormalFooter *normalFooter = (MJRefreshAutoNormalFooter *)self.mj_footer;
        normalFooter.stateLabel.hidden = !allowPullUp;
    }
}

#pragma mark - 外部方法
-(void)addCurrentPageData:(NSArray<id> *)currentPageData
{
    if (self.currentPage == 1) {
        [self.mutableArray removeAllObjects];
    }
    if (currentPageData.count > 0) {
        [self.mutableArray addObjectsFromArray:currentPageData];
    }
    [self upgradeCurrentPageCount:currentPageData.count];
}
-(void)upgradeCurrentPageCount:(long)currentPageCount
{
    if (currentPageCount >= 0) {
        self.currentPageCount = currentPageCount;
    }
}

-(void)endPullDownRefresh
{
    if (self.mj_header.state == MJRefreshStateRefreshing) {
        [self.mj_header endRefreshing];
    }
}
-(void)endPullUpRefresh
{
    if (self.mj_footer) {
        if (self.lastPage) {
            //最后一頁,結束刷新并展示無更多數(shù)據(jù)
            [self.mj_footer endRefreshingWithNoMoreData];
        }
        else
        {
            //結束刷新
            [self.mj_footer endRefreshing];
        }
    }
}
-(void)goNextPage
{
    _currentPage = _currentPage + 1;
    if (self.currentPage > 1) {
        self.allowPullUp = YES;
    }
}
-(void)resetPullUpRefresh
{
    self.allowPullUp = NO;
    _currentPage = 1;
    self.currentPageCount = -1;
    if (self.mj_footer) {
        self.mj_footer.state = MJRefreshStateIdle;
    }
}

#pragma mark - 內(nèi)部方法
-(void)tableViewPullDownAction
{
    //下拉刷新需要重置上拉操作
    [self resetPullUpRefresh];
    
    if (self.pageDelegate && [self.delegate respondsToSelector:@selector(pullDownRefreshInTableView:)]) {
        [self.pageDelegate pullDownRefreshInTableView:self];
    }
}
-(void)tableViewPullUpAction
{
    if (self.allowPullUp == NO) {
        //不允許上拉加載更多
        self.mj_footer.state = MJRefreshStateIdle;
        return;
    }
    
    if (self.pageDelegate && [self.delegate respondsToSelector:@selector(tableView:pullUpWithPage:)]) {
        [self.pageDelegate tableView:self pullUpWithPage:self.currentPage];
    }
}


@end

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容