UITableView之下拉刷新上拉加载

13年做项目没有用cocosPod,14年用了cocosPod,但依旧用之前修改的EGOTableViewPullRefreshAndLoadMore,今天看过之前版本的EGOTableViewPullRefreshAndLoadMore 发现 版本1.0.4中EGORefreshTableHeaderDelegate 比之前的多出了一个方法 :
// 返回当前数据是否是reloading,如果为YES,就不会继续发送刷新请求,如果NO则进行刷新

- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view;

题外话:我觉得是时候做出改变了

使用CocosPod 添加EGOTableViewPullRefreshAndLoadMore

pod 'EGOTableViewPullRefreshAndLoadMore', '~> 1.0.4'

继承UITableView ,新建一个子类ELTableView(EgoRefresh and LoadMore)

新建对象ELTableView时 我们不希望在ViewController 出现一堆重复的UIScrollViewDelegate代理的scrollViewDidScroll: 的方法,所以我们需要在ELTableView给出关于代理执行的方法,这里借助MessageInterceptor类,它主要解决在子类拦截(执行)其代理的方法或信息。
附上其链接:MessageInterceptor

  • 代码如下MessageInterceptor.h
#import <Foundation/Foundation.h>

@interface MessageInterceptor : NSObject {
//    id receiver;
//    id middleMan;
}
@property (nonatomic, assign) id receiver;
@property (nonatomic, assign) id middleMan;
@end
  • 代码如下MessageInterceptor.m
#import "MessageInterceptor.h"

@implementation MessageInterceptor
@synthesize receiver;
@synthesize middleMan;

- (id)forwardingTargetForSelector:(SEL)aSelector {
    if ([middleMan respondsToSelector:aSelector]) { return middleMan; }
    if ([receiver respondsToSelector:aSelector]) { return receiver; }
    return [super forwardingTargetForSelector:aSelector];
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    if ([middleMan respondsToSelector:aSelector]) { return YES; }
    if ([receiver respondsToSelector:aSelector]) { return YES; }
    return [super respondsToSelector:aSelector];
}

@end

ELTableView.h

#import <UIKit/UIKit.h>
#import "EGORefreshTableHeaderView.h"
#import "LoadMoreTableFooterView.h"
#import "MessageInterceptor.h"

typedef enum ELTableViewStyle
{
    ELTableViewStyleNone,//==UITableView
    ELTableViewStyleRefresh,//带刷新的UITableView
    ELTableViewStyleLoadMore,//带加载的UITableView
    ELTableViewStyleBoth//两者都有的UITableView

}ELTableViewStyle;
@class ELTableView;
@protocol ELTableViewDelegate <NSObject>
@optional
/* After one of the delegate methods is invoked a loading animation is started, to end it use the respective status update property */
- (void)tableViewDidTriggerRefresh:(ELTableView*)pullTableView;
- (void)tableViewDidTriggerLoadMore:(ELTableView*)pullTableView;

@end
@interface ELTableView : UITableView<UIScrollViewDelegate,EGORefreshTableHeaderDelegate,LoadMoreTableFooterDelegate>
{
    MessageInterceptor * delegateInterceptor;//本类拦截其delegate的部分代码,

}
@property(nonatomic,strong) EGORefreshTableHeaderView *refreshView;
@property(nonatomic,strong)LoadMoreTableFooterView *loadMoreView;
@property (nonatomic, assign) IBOutlet id<ELTableViewDelegate> elDelegate;
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style withELStyle:(ELTableViewStyle)pullSign;
@property (nonatomic, assign) BOOL isRefreshing;//是否正在刷新
@property (nonatomic, assign) BOOL isLoadingMore;//是否正在加载
@property(nonatomic,assign)ELTableViewStyle elStyle;//tableview的形式:
@end
ELTableView.m
@interface ELTableView (Private) <UIScrollViewDelegate,EGORefreshTableHeaderDelegate,LoadMoreTableFooterDelegate>
- (void) config;
@end
@implementation ELTableView


@synthesize refreshView;
@synthesize loadMoreView;
@synthesize elDelegate;
@synthesize isRefreshing;
@synthesize isLoadingMore;
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
{
    self = [super initWithFrame:frame style:style];
    _elStyle =  ELTableViewStyleBoth;

    if (self) {
        [self config];
    }

    return self;
}
//- (void)setElDelegate:(id<ELTableViewDelegate>)elDelegate
//{
//    _elDelegate  = elDelegate;
//}
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style withELStyle:(ELTableViewStyle)pullSign
{
    self = [super initWithFrame:frame style:style];
    _elStyle = pullSign;
    if (self) {
        [self config];
    }
    return self;
}
- (void)awakeFromNib
{
    [super awakeFromNib];
    [self config];
}
- (void) config
{
    /* Status Properties */
    delegateInterceptor = [[MessageInterceptor alloc] init];
    delegateInterceptor.middleMan = self;
    delegateInterceptor.receiver = self.delegate;
    super.delegate = (id)delegateInterceptor;
    isRefreshing = NO;
    isLoadingMore = NO;
    /* Refresh View init*/
    if ([self hasRefreshView]) {
        refreshView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -self.bounds.size.height, self.bounds.size.width, self.bounds.size.height)];

        refreshView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
        refreshView.delegate = self;
        [self addSubview:refreshView];
    }

    /* Load more view init */
    if ([self hasLoadMoreView]) {
        loadMoreView = [[LoadMoreTableFooterView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height, self.bounds.size.width, self.bounds.size.height)];
        loadMoreView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
        loadMoreView.delegate = self;
        [self addSubview:loadMoreView];
    }
}

- (void)setDelegate:(id<UITableViewDelegate>)delegate
{
    if(delegateInterceptor) {
        super.delegate = nil;
        delegateInterceptor.receiver = delegate;
        super.delegate = (id)delegateInterceptor;
    } else {
        super.delegate = delegate;
    }
}
# pragma mark - View changes

- (void)layoutSubviews
{
    [super layoutSubviews];
    if ([self hasLoadMoreView]) {
        CGFloat visibleTableDiffBoundsHeight = (self.bounds.size.height - MIN(self.bounds.size.height, self.contentSize.height));

        CGRect loadMoreFrame = loadMoreView.frame;
        loadMoreFrame.origin.y = self.contentSize.height + visibleTableDiffBoundsHeight;
        loadMoreView.frame = loadMoreFrame;
    }





}
- (BOOL)hasRefreshView{
    if (_elStyle == ELTableViewStyleBoth || _elStyle == ELTableViewStyleRefresh) {
        return YES;
    }
    return NO;
}
- (BOOL) hasLoadMoreView{
    if (_elStyle== ELTableViewStyleBoth||_elStyle == ELTableViewStyleLoadMore) {
        return YES;
    }
    return NO;
}


- (void)reloadData
{
    [super reloadData];
    // Give the footers a chance to fix it self.
    [refreshView egoRefreshScrollViewDataSourceDidFinishedLoading:self];
    [loadMoreView loadMoreScrollViewDataSourceDidFinishedLoading:self];
    isRefreshing = NO;
    isLoadingMore = NO;
}

#pragma mark - Status Propreties



- (void)setIsRefreshing:(BOOL)isRefreshingTag
{
    if (isRefreshing && !isRefreshingTag) {
        [refreshView egoRefreshScrollViewDataSourceDidFinishedLoading:self];
        isRefreshing = NO;
        return;
    }
    if (!isRefreshing && isRefreshingTag) {
        [refreshView egoRefreshScrollViewDataSourceStartManualLoading:self];
        isRefreshing = YES;
    }
}

- (void)setIsLoadingMore:(BOOL)isLoadingMoreTag
{
    if(!isLoadingMore && isLoadingMoreTag) {
        // If not allready loading more start refreshing
        [loadMoreView loadMoreScrollViewDidEndDragging:self];
        isLoadingMore = YES;
        return;
    }
    if(isLoadingMore && !isLoadingMoreTag) {
        [loadMoreView loadMoreScrollViewDataSourceDidFinishedLoading:self];
        isLoadingMore = NO;
    }
}


#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0) {
        [refreshView egoRefreshScrollViewDidScroll:scrollView];
    }else if(scrollView.contentOffset.y > 0){
        [loadMoreView loadMoreScrollViewDidScroll:scrollView];
    }


}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{

    if (scrollView.contentOffset.y < 0) {
        //向下拉
        [refreshView egoRefreshScrollViewDidEndDragging:scrollView];
    }else if(scrollView.contentOffset.y >= 0){
        [loadMoreView loadMoreScrollViewDidEndDragging:scrollView];
        //向上
    }
}

#pragma mark - EGORefreshTableHeaderDelegate

- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
{
    isRefreshing = YES;
    if (elDelegate  && [elDelegate respondsToSelector:@selector(tableViewDidTriggerRefresh:)]) {
        [elDelegate tableViewDidTriggerRefresh:self];

    }

}

- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view {
    return [NSDate date];
}
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view
{
    return isRefreshing;
}
#pragma mark - LoadMoreTableViewDelegate

- (void)loadMoreTableFooterDidTriggerLoadMore:(LoadMoreTableFooterView *)view
{
    isLoadingMore = YES;
    if (elDelegate  && [elDelegate respondsToSelector:@selector(tableViewDidTriggerLoadMore:)]) {
        [elDelegate tableViewDidTriggerLoadMore:self];
    }

}
-(BOOL)loadMoreTableFooterDataSourceIsLoading:(LoadMoreTableFooterView *)view
{
    return isLoadingMore;
}
@end

在ViewController中使用ELTableView

#import "ELTableView.h"
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,ELTableViewDelegate>
{
    NSInteger curPage;
    NSInteger allPage;
    ASIHTTPRequest *request;
    NSMutableArray *dataSource;
    BOOL reloading;
    BOOL isLoadMoreing;
}
@property(nonatomic,strong)ELTableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    curPage = 0;
    allPage = 5;


    dataSource = [NSMutableArray array];
    _tableView = [[ELTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    _tableView.delegate = self;
    _tableView.tableFooterView = [[UIView alloc]init];
    _tableView.elDelegate = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];

}

- (void)getRefreshData:(NSInteger )currentPage{

    NSLog(@"dragging!!!");
    double delayInSeconds = arc4random()%4;
    typeof (self)weakSelf = self;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        [weakSelf doneLoadingTableViewData];
    });
    self.tableView.isRefreshing = YES;

}
-(void)getMoreData{
    double delayInSeconds = 3.0;
    typeof (self)weakSelf = self;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        [weakSelf doneLoadingTableViewData];
    });
    self.tableView.isLoadingMore = YES;


}
//请求结束函数。在这里要关闭下拉的视图.并更新表视图
- (void)doneLoadingTableViewData{

    //  model should call this when its done loading
    NSLog(@"end loading");
    if (self.tableView.isRefreshing) {
        [dataSource removeAllObjects];
    }
    [dataSource addObject:[[NSString alloc] initWithFormat:@"%ld",[dataSource count]]];
    [dataSource addObjectsFromArray:@[@"A",@"B",@"C",@"D"]];
    [self.tableView reloadData];
    self.tableView.isLoadingMore = NO;
    self.tableView.isRefreshing = NO;


}


#pragma mark-   tableView
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return dataSource.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
    return cell;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)tableViewDidTriggerLoadMore:(ELTableView *)pullTableView
{
    [self getMoreData];
}
- (void)tableViewDidTriggerRefresh:(ELTableView *)pullTableView
{
    [self getRefreshData:0];
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值