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
- UITableView之下拉刷新上拉加载
- ios之下拉刷新上拉加载更多
- RecyclerView完全解析之下拉刷新与上拉加载
- 微信小程序开发之下拉刷新 上拉加载
- 微信小程序开发之下拉刷新 上拉加载
- 012 - 微信小程序开发之下拉刷新 上拉加载
- 微信小程序之下拉加载和上拉刷新
- 微信小程序之下拉加载和上拉刷新
- 微信小程序之下拉加载,上拉刷新
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载 .
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载
- ios UITableView封装之下拉-上提-图片异步加载
- 前台页面传到后台的中文数据出现乱码问题
- OPenGL/3D渲染/shader
- 为什么docker还不能广泛用于生产中
- springMVC(1) 编写springMVC的HelloWorld
- 访问者——对象行为模式
- UITableView之下拉刷新上拉加载
- Hibernate中addEntity().addscala(),返回混合类型(实体bean+其他简单类型)
- UE4渲染概述
- POJ 1733 Parity game(离散化 + 带权并查集)
- css知多少(6)——选择器的优先级
- 面向对象设计的SOLID原则
- 重新拾起程序路
- 解决kill大事务导致的undo争用
- Lua--table的遍历