项目需求
我的的列表需要改变,原来的分页加载采用的是MJRefresh框架进行加载更多数据,这需要有一个上拉动作才能触发,而我的产品的意思是当快要滑动到底部时自动加载下一页数据。我自己看了一下,发现很多app都是采用这种模式。
关于MJRefresh
MJRefresh中并没有这样的方法,所以这个效果不一定是MJRefresh实现的,没有实现的小伙伴就不要在MJRefresh中苦苦寻找了。
功能实现
实现方法很简单,需要用到tableView的一个代理方法,就可轻松实现。- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath就是这个方法,自定义显示cell。这个方法不太常用。但是这个方法可在每个cell将要第一次出现的时候触发。然后我们可设置当前页面第几个cell将要出现时,触发请求加载更多数据。
具体代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
- ( 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; } } } } |
效果如下
流畅.gif
是不是很流畅。当然还得配上MJRefresh下拉加载,以防网络状态不好的情况下刷不出数据。
关于加载时抖动问题可加上
1
2
3
|
self.tableView.estimatedRowHeight = 0; self.tableView.estimatedSectionHeaderHeight = 0; self.tableView.estimatedSectionFooterHeight = 0; |
关闭预估算高度.
总结
到此这篇关于iOS列表上拉(平滑加载数据)自动加载数据问题解决的文章就介绍到这了,更多相关iOS列表上拉自动加载数据内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.jianshu.com/p/55c0f5b5670f