项目需求
我的的列表需要改变,原来的分页加载采用的是MJRefresh框架进行加载更多数据,这需要有一个上拉动作才能触发,而我的产品的意思是当快要滑动到底部时自动加载下一页数据。我自己看了一下,发现很多app都是采用这种模式。
关于MJRefresh
MJRefresh中并没有这样的方法,所以这个效果不一定是MJRefresh实现的,没有实现的小伙伴就不要在MJRefresh中苦苦寻找了。
功能实现
实现方法很简单,需要用到tableView的一个代理方法,就可轻松实现。- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath就是这个方法,自定义显示cell。这个方法不太常用。但是这个方法可在每个cell将要第一次出现的时候触发。然后我们可设置当前页面第几个cell将要出现时,触发请求加载更多数据。
具体代码
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger row = [indexPath row];
if (row == self.dataArray.count - 2 && self.isfinish) {
//dataArray是存放数据的数组,isfinish是请求是否完成的标识
self.pageNum++;//第几页
[self.updataDic addEntriesFromDictionary:@{@"pageSize": @(10), @"pageNum" :@(self.pageNum)}];//请求参数
[self setupDataModel];//具体请求
}
}
-(void)serverApi_FinishedSuccessed:(APIRequest *)api result:(APIResult *)sr
{//网络请求成功代理方法
if (api == self.goodsAPIRequest) {
if (self.goodsAPIRequest.netWorkType == 22) {
self.dataModel = [[GoodsListModelBase alloc]initWithDictionary:sr.dic];//转化model
[self.dataArray addObjectsFromArray:self.dataModel.data];
if (self.dataModel.data.count == 0) {
[self.tableView.mj_footer endRefreshingWithNoMoreData];
self.isfinish = NO;
}else {
[self.tableView reloadData];
if (@available(iOS 11,*)) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//iOS11之后reloadData方法会执行- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 方法,将当前所有的cell过一遍,而iOS11之前只是将展示的cell过一遍。故加此方法使其在过第一次的时候不执行加载更多数据
self.isfinish = YES;
});
}else {
self.isfinish = YES;
}
}
}
}
效果如下
是不是很流畅。当然还得配上MJRefresh下拉加载,以防网络状态不好的情况下刷不出数据。
关于加载时抖动问题可加上
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
关闭预估算高度.