在许多应用中都有下拉刷新这一功能,这使得数据的刷新变得非常容易。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文件中添加如下代码
@interface ...ViewController : UITableViewController<EGORefreshTableHeaderDelegate>
{
EGORefreshTableHeaderView *refreshTableHeaderView;
BOOL reloading;
}
- (void)reloadTableViewDataSource;
- (void)doneLoadingTableViewData;
(2)在- (void)viewDidLoad函数中添加下面的代码。
if (refreshTableHeaderView == nil) {
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
view.delegate = self;
[self.tableView addSubview:view];
refreshTableHeaderView = view;
[view release];
}
//最后一次更新的时间
[refreshTableHeaderView refreshLastUpdatedDate];
(3)在对应的.m文件中添加如下方法
#pragma mark -
#pragma mark Data Source Loading / Reloading Methods
//更新列表数据
- (void)reloadTableViewDataSource{
[NSThread detachNewThreadSelector:@selector(updateNewsByPullTable) toTarget:self withObject:nil]; //异步加载数据,不影tableView动作
reloading = YES;
}
//调用JSON服务获取数据
- (void)updateNewsByPullTable
{
NSString *str = @"http://....../getAllNews.aspx";
NSURL *url = [NSURL URLWithString:str];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
//接收返回数据
NSString *response = [request responseString];
NSLog(@"%@",response);
self.data = [response JSONValue];
[self.tableView reloadData];
}
- (void)doneLoadingTableViewData{
//model should call this when its done loading
reloading = NO;
[refreshTableHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
}
#pragma mark -
#pragma mark UIScrollViewDelegate Methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[refreshTableHeaderView egoRefreshScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[refreshTableHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
}
#pragma mark -
#pragma mark EGORefreshTableHeaderDelegate Methods
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
[self reloadTableViewDataSource];
[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.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
}
总的来说,实现这一功能并不复杂,关键在于-(void)reloadTableViewDataSource这一方法。这里我试了一下,读取数据的操作必须是异步的,要不然和tableView下拉再上弹这个动作会有很明显的延迟。再一次感受到了开源类库的强大,感谢这些大神们的无私贡献,让我们这些iOS开发初学者有机会能做出漂亮的应用。