今天我们来给昨天的Demo加上下拉刷新和上拉加载更多的功能.
1.下拉刷新.
在viewDidLoad中调用方法addRefreshControl,下拉时可以出现风火轮加载更多的效果.
- (void)addRefreshControl { self.refreshControl = [[[UIRefreshControl alloc] initWithFrame:CGRectZero] autorelease]; //frame不用给,系统默认有. self.refreshControl.attributedTitle = [[[NSAttributedString alloc] initWithString:@"下拉刷新数据"] autorelease]; //添加响应事件 [self.refreshControl addTarget:self action:@selector(handleReload:) forControlEvents:UIControlEventValueChanged]; }
响应事件的要根据实际情况,这里写成一个方法,当下拉时,重新向服务器请求(第一页)数据.
- (void)handleReload:(UIRefreshControl *)refresh { //请求最新数据,第一页数据. [self loadDataWithIndex:0]; }
这里的loadWithIndex方法也是为了能够总是请求第一页数据,也就是index为0("http://c.m.163.com/nc/article/list/T1348648517839/%ld-50.html",index);
//将请求的服务器地址单独写成一个方法,便于在下拉刷新和上拉加载时候调用. //第一页:0 - 20; 第二页:20 - 20; 第三页:30 - 20.... - (void)loadDataWithIndex:(NSInteger)index { _index = index; //设置请求网址 self.engine.linkName = [NSString stringWithFormat:kNewsAPI, index];//0 - 20条数据 //开始网络请求 [self.engine startDownloadData]; }
下拉刷新完毕.
下面是上拉加载更多.
那么什么时候应该加载呢?---当"上拉加载"这个Cell出现时候,说明视图已经滚动到了最后面.这时候我们可以调用UITableViewDelegate协议中的一个方法来让数据加载;
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { //如果要展示的Cell是最后一行,请求下一页数据 if (indexPath.row == self.dataSource.count) { LoadingCell *cell1 = (LoadingCell *)cell; //将Cell转换一下类型,如果不做这一步,tableView并不知道这最后一个Cell是哪一套Cell [cell1.indicatorView startAnimating]; //加载更多数据,下一页数据 [self loadDataWithIndex:self.dataSource.count];//第一页0-20,self.data.count=20,第二页20-20,count=40,第三页40-20,count=60; } }