EGOTableViewPullRefresh(一)实现下拉刷新
我们用到一个EGOTableViewPullRefresh的开源项目来实现这个功能,先到这里下载源码,下载完成后里面有个Demo是可以直接运行的Xcode工程,然后就是这个开源项目的源码,学习如何使用可以参照Demo。
在使用下拉刷新类库EGORefreshTableHeaderView的时候,将资源文件添加到工程中,也不要忘记添加QuartzCore.framework框架。
1.打开MainViewController.xib文件然后拖入一个UITableViewController并连接DataSource和Delegate,然后在MainViewController.h文件中声明UITableView的协议。
1 #import 2 #import "EGORefreshTableHeaderView.h" 3 4 @interface MainViewController : UITableViewController 5 { 6 EGORefreshTableHeaderView *_refreshTableView; 7 BOOL _reloading; 8 } 9 10 @property (strong,nonatomic) NSArray *array; 11 12 //开始重新加载时调用的方法 13 - (void)reloadTableViewDataSource; 14 //完成加载时调用的方法 15 - (void)doneLoadingTableViewData; 16 17 @end
1 #import "MainViewController.h" 2 3 @interface MainViewController () 4 5 @end 6 7 @implementation MainViewController 8 @synthesize array = _array; 9 10 #pragma mark - 11 #pragma mark View life cycle 12 -(void)viewDidLoad 13 { 14 [super viewDidLoad]; 15 16 //设置导航条标题 17 self.navigationItem.title = @"Pull Refresh"; 18 19 if (_refreshTableView == nil) { 20 //初始化下拉刷新控件 21 EGORefreshTableHeaderView *refreshView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)]; 22 refreshView.delegate = self; 23 //将下拉刷新控件作为子控件添加到UITableView中 24 [self.tableView addSubview:refreshView]; 25 _refreshTableView = refreshView; 26 } 27 28 //初始化用于填充表格的数据 29 NSArray *dataArray = [NSArray arrayWithObjects:@"Ryan",@"Vivi", nil]; 30 self.array = dataArray; 31 32 //重新加载表格数据 33 [self.tableView reloadData]; 34 35 } 36 37 -(void)viewDidUnload 38 { 39 [super viewDidUnload]; 40 _refreshTableView = nil; 41 } 42 43 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 44 { 45 return (interfaceOrientation == UIInterfaceOrientationPortrait); 46 } 47 48 # pragma mark - 49 # pragma mark UITableViewDataSource Methods 50 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 51 { 52 return 10; 53 } 54 55 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 56 { 57 return [self.array count]; 58 } 59 60 //带头标题的表格设置标题方法 61 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 62 { 63 return [NSString stringWithFormat:@"Title %d",section + 1]; 64 } 65 66 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 67 { 68 static NSString *CellIdentifier = @"CellIdentifier"; 69 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 70 71 if (!cell) { 72 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 73 } 74 75 cell.textLabel.text = [self.array objectAtIndex:indexPath.row]; 76 77 return cell; 78 } 79 80 #pragma mark - 81 #pragma mark Data Source Loading / Reloading Methods 82 //开始重新加载时调用的方法 83 - (void)reloadTableViewDataSource{ 84 _reloading = YES; 85 //开始刷新后执行后台线程,在此之前可以开启HUD或其他对UI进行阻塞 86 [NSThread detachNewThreadSelector:@selector(doInBackground) toTarget:self withObject:nil]; 87 } 88 89 //完成加载时调用的方法 90 - (void)doneLoadingTableViewData{ 91 NSLog(@"doneLoadingTableViewData"); 92 93 _reloading = NO; 94 [_refreshTableView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView]; 95 //刷新表格内容 96 [self.tableView reloadData]; 97 } 98 99 #pragma mark - 100 #pragma mark Background operation 101 //这个方法运行于子线程中,完成获取刷新数据的操作 102 -(void)doInBackground 103 { 104 NSLog(@"doInBackground"); 105 106 NSArray *dataArray2 = [NSArray arrayWithObjects:@"Ryan2",@"Vivi2", nil]; 107 self.array = dataArray2; 108 [NSThread sleepForTimeInterval:3]; 109 110 //后台操作线程执行完后,到主线程更新UI 111 [self performSelectorOnMainThread:@selector(doneLoadingTableViewData) withObject:nil waitUntilDone:YES]; 112 } 113 114 115 #pragma mark - 116 #pragma mark EGORefreshTableHeaderDelegate Methods 117 //下拉被触发调用的委托方法 118 -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view 119 { 120 [self reloadTableViewDataSource]; 121 } 122 123 //返回当前是刷新还是无刷新状态 124 -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view 125 { 126 return _reloading; 127 } 128 129 //返回刷新时间的回调方法 130 -(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view 131 { 132 return [NSDate date]; 133 } 134 135 #pragma mark - 136 #pragma mark UIScrollViewDelegate Methods 137 //滚动控件的委托方法 138 -(void)scrollViewDidScroll:(UIScrollView *)scrollView 139 { 140 [_refreshTableView egoRefreshScrollViewDidScroll:scrollView]; 141 } 142 143 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 144 { 145 [_refreshTableView egoRefreshScrollViewDidEndDragging:scrollView]; 146 } 147 148 @end