iOS下拉刷新的实现

首先,用到一个开源框架,可以去https://github.com/enormego/EGOTableViewPullRefresh下载。

 

然后,将里面的EGORefreshTableHeaderView.h和EGORefreshTableHeaderView.m拷到相应的项目里,在需要下拉刷新的页面对应的视图控制器中添加以下代码。

 

头文件:

 

Ios代码   收藏代码
  1. #import "EGORefreshTableHeaderView.h"  
  2.   
  3. @interface RootViewController : UITableViewController  <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{     
  4.     EGORefreshTableHeaderView *_refreshHeaderView;  
  5.     BOOL _reloading;  
  6. }  
  7.   
  8. - (void)reloadTableViewDataSource;  
  9. - (void)doneLoadingTableViewData;  
  10. @end  

 

实现文件:

 

Ios代码   收藏代码
  1. #import "RootViewController.h"  
  2.   
  3. @implementation RootViewController  
  4.   
  5. - (void)viewDidLoad {  
  6.     [super viewDidLoad];  
  7.       
  8.     if (_refreshHeaderView == nil) {          
  9.         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)];  
  10.         view.delegate = self;  
  11.         [self.tableView addSubview:view];  
  12.         _refreshHeaderView = view;  
  13.         [view release];       
  14.     }  
  15.       
  16.     [_refreshHeaderView refreshLastUpdatedDate];      
  17. }  
  18.   
  19. #pragma mark -  
  20. #pragma mark UITableViewDataSource  
  21.   
  22. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
  23.     return 10;  
  24. }  
  25.   
  26. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  
  27.     return 4;  
  28. }  
  29.   
  30. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  31.       
  32.     static NSString *CellIdentifier = @"Cell";  
  33.       
  34.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
  35.     if (cell == nil) {  
  36.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
  37.     }  
  38.       
  39.     return cell;  
  40. }  
  41.   
  42. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{      
  43.     return [NSString stringWithFormat:@"Section %i", section];    
  44. }  
  45.   
  46. #pragma mark -  
  47. #pragma mark Data Source Loading / Reloading Methods  
  48.   
  49. - (void)reloadTableViewDataSource{  
  50.     _reloading = YES;     
  51. }  
  52.   
  53. - (void)doneLoadingTableViewData{  
  54.     _reloading = NO;  
  55.     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];     
  56. }  
  57.   
  58. #pragma mark -  
  59. #pragma mark UIScrollViewDelegate Methods  
  60.   
  61. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{       
  62.     [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];        
  63. }  
  64.   
  65. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{      
  66.     [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];   
  67. }  
  68.   
  69. #pragma mark -  
  70. #pragma mark EGORefreshTableHeaderDelegate Methods  
  71.   
  72. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{      
  73.     [self reloadTableViewDataSource];  
  74.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];     
  75. }  
  76.   
  77. - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{    
  78.     return _reloading;   
  79. }  
  80.   
  81. - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{   
  82.     return [NSDate date];     
  83. }  
  84.   
  85. #pragma mark -  
  86. #pragma mark Memory Management  
  87.   
  88. - (void)didReceiveMemoryWarning {  
  89.     [super didReceiveMemoryWarning];  
  90. }  
  91.   
  92. - (void)viewDidUnload {  
  93.     _refreshHeaderView=nil;  
  94. }  
  95.   
  96. - (void)dealloc {     
  97.     _refreshHeaderView = nil;  
  98.     [super dealloc];  
  99. }  
  100.   
  101. @end  

 

最后,一个很重要的步骤,别忘了加入QuartzCore.framework框架。

 

上文的实现中有个这样的方法:

 

Ios代码   收藏代码
  1. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{        
  2.     [self reloadTableViewDataSource];    
  3.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];       
  4. }  

 

显然,这是有问题的。当触发刷新的时候,我们需要和服务端进行交互,这时就会执行这个代理方法,首先调用了reloadTableViewDataSource,表示要和服务端进行交互了,此时_reloading值为YES,3秒后又调用了doneLoadingTableViewData,从而结束刷新效果的显示,我们实际上是假设这时候服务端已经正常将数据发送到客户端来了。事实上,实际收到服务端的数据所用的时间是不确定的,所以,应该在数据返回后再结束刷新效果。

 

Ios代码   收藏代码
  1. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{        
  2.     [self reloadTableViewDataSource];    
  3.     //发送异步请求的代码      
  4. }  
  5.   
  6. - (void)requestFinished:(ASIHTTPRequest *)request {  
  7.     [self doneLoadingTableViewData];  
  8. }  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值