http://blog.youkuaiyun.com/xiaofansong/article/details/8260258
现在流行的列表上拉刷新基本上都是使用的EGOTableViewPullRefresh开源的类库。
1、到github上下载EGOTableViewPullRefresh
https://github.com/enormego/EGOTableViewPullRefresh
2、下载后的文件夹中包含以下内容
将EGOTableViewPullRefresh中的Resources文件夹中的所有图片全部都拷贝到自己的工程的Resources文件夹下,这些图片是下拉箭头及tableView的headerView的背景图片。在EGOTableViewPullRefresh文件夹下的Classes文件夹下的View文件夹下有两个文件,分别是EGORefreshTableHeaderView.h和EGORefreshTableHeaderView.m文件,将这两个文件放到自己的工程下。到此为止准备工作就做完了。
3、下拉是一个刷新的工作,所以需要我们添加的代码无非就是数据刷新的代码。
(1)在.h文件中添加如下代码
- #import "EGORefreshTableHeaderView.h"
- @interface RootViewController : UITableViewController <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{
- EGORefreshTableHeaderView *_refreshHeaderView;
- // Reloading var should really be your tableviews datasource
- // Putting it here for demo purposes
- BOOL _reloading;
- }
- - (void)reloadTableViewDataSource;
- - (void)doneLoadingTableViewData;
#import "EGORefreshTableHeaderView.h"
@interface RootViewController : UITableViewController <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{
EGORefreshTableHeaderView *_refreshHeaderView;
// Reloading var should really be your tableviews datasource
// Putting it here for demo purposes
BOOL _reloading;
}
- (void)reloadTableViewDataSource;
- (void)doneLoadingTableViewData;
(2)在- (void)viewDidLoad函数中添加下面的代码。
- if (_refreshHeaderView == nil) {
- EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame: CGRectMake(0.0f, self.tableView.contentSize.height, 320, 650)];
- NSLog(@"%@", NSStringFromCGRect( view.frame ));
- view.delegate = self;
- [self.tableView addSubview:view];
- _refreshHeaderView = view;
- [view release];
- }
- // update the last update date
- [_refreshHeaderView refreshLastUpdatedDate];
if (_refreshHeaderView == nil) {
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame: CGRectMake(0.0f, self.tableView.contentSize.height, 320, 650)];
NSLog(@"%@", NSStringFromCGRect( view.frame ));
view.delegate = self;
[self.tableView addSubview:view];
_refreshHeaderView = view;
[view release];
}
// update the last update date
[_refreshHeaderView refreshLastUpdatedDate];
(3)在对应的.m文件中添加如下方法
- #pragma mark -
- #pragma mark Data Source Loading / Reloading Methods
- - (void)reloadTableViewDataSource{
- // should be calling your tableviews data source model to reload
- // put here just for demo
- _reloading = YES;
- }
- - (void)doneLoadingTableViewData{
- // model should call this when its done loading
- _reloading = NO;
- [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
- }
- #pragma mark -
- #pragma mark UIScrollViewDelegate Methods
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
- [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
- }
- - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
- [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
- }
- #pragma mark -
- #pragma mark EGORefreshTableHeaderDelegate Methods
- - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
- [self reloadTableViewDataSource];
- [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];
- }
- - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
- return _reloading; // should return if data source model is reloading
- }
- - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
- return [NSDate date]; // should return date data source was last changed
- }
#pragma mark -
#pragma mark Data Source Loading / Reloading Methods
- (void)reloadTableViewDataSource{
// should be calling your tableviews data source model to reload
// put here just for demo
_reloading = YES;
}
- (void)doneLoadingTableViewData{
// model should call this when its done loading
_reloading = NO;
[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
}
#pragma mark -
#pragma mark UIScrollViewDelegate Methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
}
#pragma mark -
#pragma mark EGORefreshTableHeaderDelegate Methods
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
[self reloadTableViewDataSource];
[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];
}
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
return _reloading; // should return if data source model is reloading
}
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
return [NSDate date]; // should return date data source was last changed
}
4、总结
A:这个是在底部加刷新。如果在顶部加刷新那么只要修改下ViewDidload的创建代码
- EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)];
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)];
B:如果想同时在顶部或者底部都加上刷新,可以参考我另外一个帖子(关于糗百,开发笔记一里面所使用的方法)
C:如果想实现在列表最后一行实现点击查询,那么可以在列表下多加一行,自己写一个类继承UItableviewcell,然后在点击事件里面做一个判断。
D:假如遇到数据刷新之后那个顶部的view还在刷新,这个可能是egoRefreshTableHeaderDidTriggerRefresh里面同步执行的代码
- - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
- {
- [self reloadTableViewDataSource];
- [self performSelector:@selector(refresh) withObject:nil afterDelay:2.0f];
- // [self refresh];
- }
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
{
[self reloadTableViewDataSource];
[self performSelector:@selector(refresh) withObject:nil afterDelay:2.0f];
// [self refresh];
}
这里读取数据的操作必须是异步的,要不然和tableView下拉再上弹这个动作会有很明显的延迟。