使用RefreshBar实现上拉刷新表格

来源:互联网 发布:mac关闭spotlight搜索 编辑:程序博客网 时间:2024/04/24 19:25

转载:http://blog.csdn.net/kmyhy/article/details/7522299


大名鼎鼎的egoTableViewPullRefresh想必大家都听说过。它是一个下拉刷新表格控件。当你将TableView向下拉到一定位置,表视图单元格将自动刷新数据。但是这次我们想介绍的不是egoTableViewPullRefresh,我们将介绍一个自己实现的RefreshBar控件,这个控件可以用在普通的TableView中,使我们能够在UITableView上实现上拉刷新的功能。因为我一直觉得上拉刷新要比下拉刷新的用户体验要好。因为人的阅读习惯是从上往下的,而你滚动表格时,也是“上拉”的动作,当你拉到当前表格的最后一行时,你刚好可以看到RefreshBar控件显示出来,此时只需要再次上拉(而不需要象“下拉”刷新一样要回到表格头部)就可加载更多行。

这是RefreshBar的项目地址:

https://github.com/kmyhy/RefreshBar

一、RefreshBar的特性

RefreshBar是一个“上拉刷新”手势识别的组件。可以将RefreshBar用于你的UITableView上。它具有以下功能:

1、“上拉”时提示


2、继续上拉,识别为“刷新”手势


3、释放手指,开始刷新。在刷新过程中,动画被禁止


4、刷新完毕,显示刷新日期。无数据进行提示


二、将RefreshBar加到项目中

你下载解压后,可以看到两个目录:RefreshBar和ProgressiveRefreshTableApp。分别对应RefreshBar的源文件目录和它的demo项目,你可以直接运行demo,学习如何使用RefreshBar。这是完全开源和免费的,如果你要在自己的项目中使用它,把RefreshBar目录整个复制到你的项目中即可,包括以下5个文件:

§  RefreshBar.xib

§  RefreshBar.m

§  RefreshBar.h

§  grayArrow.png

§  whiteArrow.png

 

二、初始化

如果要在你的View Controller中使用RefreshBar,你需要在viewDidLoad中初始化它,并将它添加到UITableView的下方:

_refreshBar=[[RefreshBaralloc]init];

    [_refreshBarsetFrame:CGRectMake(0.0f,

                               0.0f + self.tableView.frame.size.height,

                               self.view.frame.size.width,

                               _refreshBar.frame.size.height)];

[self.tableViewaddSubview:_refreshBar];

三、实现委托

要让RefreshBar能正常工作,你必需在初始化它后设置它的delegate属性:

_refreshBar.delegate=self;

委托对象(即View Controller)总共需要实现两个委托协议:

RefreshBarDelegate,UIScrollViewDelegate

其中,UIScrollViewDelegate协议方法的实现最为简单,它们都调用了RefreshBar的方法:

#pragma mark -ScrollView delegate

 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    [_refreshBarscrollViewDidScroll:scrollView];

}

 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate{

    [_refreshBarscrollViewDidEndDragging:scrollView];

}

然后是RefreshBarDelegate协议。这个协议定义了4个方法,都是必需实现的:

-(void)beginDataSourceLoading:(RefreshBar*)refreshBar;

-(BOOL)hasMoreData;

-(BOOL)isDataSourceLoading;

-(void)endDataSourceLoading:(RefreshBar*)refreshBar;

beginDataSourceLoading:方法在RefreshBar感知到一个有效的“上拉刷新”手势时调用,这个方法中,你应该加载新的行数据。

如果这个过程是耗时的,你还应该设置一些标记(标识过程是否结束)。

在过程结束时,应该手动调用RefreshBar的dataSourceDidLoad:方法,这个方法仅仅是通知RefreshBar,数据加载的过程已经结束了。

例如:

-(void)beginDataSourceLoading:(RefreshBar *)refreshBar{

    _loading=YES;

loadedCount++;

     _loading=NO;

    // call the refresh bar, data loadingis end

    [_refreshBardataSourceDidLoad:self.tableView];

}

hasMoreData方法是RefreshBar用于询问delegate对象是否还有新的行数据的方法。例如我们仅仅通过刷新动作的次数来决定是否还有多余的数据。例如,如果加载次数超过2次,我们就认为不再有新的行数据:

-(BOOL)hasMoreData{

    returnloadedCount<3;

}

isDataSourceLoading方法是RefreshBar用于询问delegate对象是否数据加载过程已经结束的方法。在这个方法中,我们可以通过简单的判断标志变量来决定是否加载过程已结束:

-(BOOL)isDataSourceLoading{

    return [selfhasMoreData] &&_loading;

}

endDataSouceLoading方法允许你在数据加载完成时做一些事情,比如重新刷新TableView:

-(void)endDataSourceLoading:(RefreshBar *)refreshBar{

    [self.tableViewreloadData];

}

四、demo程序

压缩包中包含demo,即ProgressiveRefreshTableApp目录。