IOS开发笔记(2)EGOTableViewPullRefresh实现列表的下拉刷新功能



http://blog.csdn.net/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文件中添加如下代码

  1. #import "EGORefreshTableHeaderView.h"  
  2.   
  3. @interface RootViewController : UITableViewController  <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{  
  4.       
  5.     EGORefreshTableHeaderView *_refreshHeaderView;  
  6.       
  7.     //  Reloading var should really be your tableviews datasource  
  8.     //  Putting it here for demo purposes   
  9.     BOOL _reloading;  
  10. }  
  11.   
  12. - (void)reloadTableViewDataSource;  
  13. - (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函数中添加下面的代码。

  1. if (_refreshHeaderView == nil) {  
  2.           
  3.         EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame: CGRectMake(0.0f, self.tableView.contentSize.height, 320, 650)];  
  4.         NSLog(@"%@", NSStringFromCGRect( view.frame ));  
  5.         view.delegate = self;  
  6.         [self.tableView addSubview:view];  
  7.         _refreshHeaderView = view;  
  8.         [view release];  
  9.           
  10.     }  
  11.       
  12.     //  update the last update date  
  13.     [_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文件中添加如下方法

  1. #pragma mark -  
  2. #pragma mark Data Source Loading / Reloading Methods  
  3.   
  4. - (void)reloadTableViewDataSource{  
  5.       
  6.     //  should be calling your tableviews data source model to reload  
  7.     //  put here just for demo  
  8.     _reloading = YES;  
  9.       
  10. }  
  11.   
  12. - (void)doneLoadingTableViewData{  
  13.       
  14.     //  model should call this when its done loading  
  15.     _reloading = NO;  
  16.     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];  
  17.       
  18. }  
  19.   
  20.   
  21. #pragma mark -  
  22. #pragma mark UIScrollViewDelegate Methods  
  23.   
  24. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{   
  25.       
  26.     [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];  
  27.           
  28. }  
  29.   
  30. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{  
  31.       
  32.     [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];  
  33.       
  34. }  
  35.   
  36.   
  37. #pragma mark -  
  38. #pragma mark EGORefreshTableHeaderDelegate Methods  
  39.   
  40. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{  
  41.       
  42.     [self reloadTableViewDataSource];  
  43.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];  
  44.       
  45. }  
  46.   
  47. - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{  
  48.       
  49.     return _reloading; // should return if data source model is reloading  
  50.       
  51. }  
  52.   
  53. - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{  
  54.       
  55.     return [NSDate date]; // should return date data source was last changed  
  56.       
  57. }  
#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的创建代码

  1. 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里面同步执行的代码

  1. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view  
  2. {  
  3.     [self reloadTableViewDataSource];  
  4.     [self performSelector:@selector(refresh) withObject:nil afterDelay:2.0f];  
  5.    // [self refresh];  
  6.       
  7. }  
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
{
    [self reloadTableViewDataSource];
    [self performSelector:@selector(refresh) withObject:nil afterDelay:2.0f];
   // [self refresh];
    
}


这里读取数据的操作必须是异步的,要不然和tableView下拉再上弹这个动作会有很明显的延迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值