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