UITableView之下拉刷新上拉加载

来源:互联网 发布:查看linux执行过的命令 编辑:程序博客网 时间:2024/04/28 14:15

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
原创粉丝点击