EGOTableViewPullRefresh是在GitHub中的开源项目,针对ios的下拉刷新功能的一个框架,我们可以用来对其进行扩展或者实现ios的下拉刷新功能,EGOTableViewPullRefresh的下载地址:https://github.com/enormego/EGOTableViewPullRefresh,先下载源码,然后一步一步的来实现!
使用TableView配合EGOTableViewPullRefresh框架实现下拉刷新的效果:
1、创建项目将EGOTableViewPullRefresh框架放入项目中,并且再加入QuartzCore.framework因为EGOTableViewPullRefresh会用到这个框架。
2、在控制器中(ViewController)放入一个UITableView控件并且设置好关联跟代理,实现UITableView的代理函数,并且加入一些测试数据。
- #import "PullViewController.h"
- @interface PullViewController (){
- //测试数据
- NSMutableArray *tableData;
- }
- @end
- @implementation PullViewController
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- }
- return self;
- }
- - (void)viewDidLoad
- {
- //初始化一些数据用来填充tableView
- tableData = [[NSMutableArray alloc] initWithObjects:@"java",@"c/c++",@"python",@"objective-c",@"javascript", nil];
- [super viewDidLoad];
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- }
- //返回tableView的分区个数
- -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
- return 1;
- }
- //返回tableView的行数
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
- return [tableData count];
- }
- //填充tableView的数据
- -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
- if(cell==nil){
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
- }
- cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
- return cell;
- }
运行效果:
4、在控制器头文件中导入EGOTableViewPullRefresh并且加入框架协议,定义两个刷新数据的函数:
- #import <UIKit/UIKit.h>
- #import "EGORefreshTableHeaderView.h"
- @interface PullViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,EGORefreshTableHeaderDelegate>{
- BOOL reloading;
- EGORefreshTableHeaderView *refreshTableHeaderView;
- }
- @property (retain, nonatomic) IBOutlet UITableView *tableView;
- - (IBAction)reloadButton:(id)sender;
- //function:
- - (void)reloadTableViewDataSource;//开始加载时调用此方法
- - (void)doneLoadingTableViewData;//完成加载时调用此方法
- @end
5、在.m文件里的viewDidLoad函数中初始化EGOTableViewPullRefresh:
- - (void)viewDidLoad
- {
- //初始化一些数据用来填充tableView
- tableData = [[NSMutableArray alloc] initWithObjects:@"java",@"c/c++",@"python",@"objective-c",@"javascript", nil];
- //初始化EGOTableViewPullRefresh
- 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];
- [super viewDidLoad];
- }
6、实现EGOTableViewPullRefresh的函数实现下拉刷新:reloadTableViewDataSource函数是刚刚在头文件中定义的函数,用来实现刷新数据在代码中让线程睡眠一段时间模仿数据调用的时间,并且给tableView增加一些新的数据最后刷新tableView。doneloadingTableViewData函数也是在头文件中定义的函数用来结束下拉刷新。
- #pragma mark - 下拉操作:
- - (void)reloadTableViewDataSource{
- reloading = YES;
- //线程睡眠一段时间,模仿数据调用
- [NSThread sleepForTimeInterval:3];
- //给tableView添加一些数据
- [tableData addObjectsFromArray:[[NSArray alloc] initWithObjects:@"c#",@"php",@"t-sql", nil]];
- //刷新tableView
- [self.tableView reloadData];
- //后台操作线程执行完后,到主线程停止界面的刷新
- [self performSelectorOnMainThread:@selector(doneLoadingTableViewData) withObject:nil waitUntilDone:YES];
- }
- - (void)doneLoadingTableViewData{
- reloading = NO;
- //结束下拉刷新
- [refreshTableHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
- }
- //当tableView滚动时就会调用这个函数
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
- NSLog(@"滚动时调用");
- [refreshTableHeaderView egoRefreshScrollViewDidScroll:scrollView];
- }
- //当tableView滚动结束时就会调用这个函数
- - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
- NSLog(@"滚动结束时调用");
- [refreshTableHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
- }
- #pragma mark EGORefreshTableHeaderDelegate function:
- //当弹出下拉界面时调用此函数
- - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
- NSLog(@"下拉界面时");
- //调用reloadTableViewDataSource函数刷新tableView;
- [NSThread detachNewThreadSelector:@selector(reloadTableViewDataSource) toTarget:self withObject:nil];
- }
- - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
- return reloading;
- }
- //最后一次改变的数据
- - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
- return [NSDate date];
- }
实现效果:
刷新后新增加的数据:
7、实现手动下拉刷新效果,为ViewController的界面中加入一个toolbar空间并且在toolbar上加入一个item button设置好关联:
8、编写手动下拉刷新代码:
- #pragma mark 手动调用下拉刷新函数
- -(void) ViewFrashData{
- //设置tableView的高度触发刷新事件
- [self.tableView setContentOffset:CGPointMake(0, -75) animated:YES];
- [self performSelector:@selector(doneManualRefresh) withObject:nil afterDelay:0.4];
- }
- //结束刷新
- -(void)doneManualRefresh{
- [refreshTableHeaderView egoRefreshScrollViewDidScroll:self.tableView];
- [refreshTableHeaderView egoRefreshScrollViewDidEndDragging:self.tableView];
- }
- //刷新按钮事件
- - (void) reloadInfo{
- //手动下拉刷新相关
- [self ViewFrashData];
- }
- //点击按钮刷新tableView
- - (IBAction)reloadButton:(id)sender {
- [self reloadInfo];
- }
最终效果:点击刷新按钮实现刷新