iOS列表上拉(平滑加载数据)自动加载数据的问题解决

项目需求

我的的列表需要改变,原来的分页加载采用的是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;
                }
             }
 }
}

效果如下


流畅.gif

是不是很流畅。当然还得配上MJRefresh下拉加载,以防网络状态不好的情况下刷不出数据。

关于加载时抖动问题可加上

    self.tableView.estimatedRowHeight = 0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;

关闭预估算高度.

总结

到此这篇关于iOS列表上拉(平滑加载数据)自动加载数据问题解决的文章就介绍到这了,更多相关iOS列表上拉自动加载数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-07-11

举例讲解iOS中延迟加载和上拉刷新/下拉加载的实现

lazy懒加载(延迟加载)UITableView 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动经过了,图片就开始加载了,这样用户体验就不太好,而且浪费内存.              这个时候,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载.               刚开始我异步加载图片利用SDWe

iOS实现MJRefresh下拉刷新(上拉加载)使用详解

下拉刷新控件目前比较火的有好几种,本人用过MJRefresh 和 SVPullToRefresh,相对而言,前者比后者可定制化.拓展新都更高一点. 因此本文着重讲一下MJRefresh的简单用法. 导入项目: cocoapods导入:pod 'MJRefresh' 手动导入: 将MJRefresh文件夹中的所有文件拽入项目中 导入主头文件:#import "MJRefresh.h" 使用介绍: 广泛性分为6种使用场景,分别对应:默认.动画图片.隐藏时间.隐藏时间和状态.自定义文字说明.

iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码

废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableViewCell.h" #define kDeviceWidth [UIScreen mainScreen].bounds.size.width #define kDeviceHeight [UIScreen mainScreen].bounds.

ios基于MJRefresh实现上拉刷新和下拉加载动画效果

本文介绍了ios基于MJRefresh实现上拉刷新和下拉加载动画效果,分享给大家,具体如下: 目录 1. 头部刷新动画 2.尾部刷新动画 头部刷新动画 #import <MJRefresh/MJRefresh.h> @interface HZNormalHeader : MJRefreshGifHeader @end #import "HZNormalHeader.h" @implementation HZNormalHeader #pragma mark - 重写父类的方

Spring实现上拉刷新和下拉加载效果

本文实例为大家分享了Spring实现上拉刷新和下拉加载效果,供大家参考,具体内容如下 导依赖: compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.liaoinstan.springview:library:1.3.0' compile files('libs/glide-3.7.0.jar') activity_main布局 <?xml version="1.0" encoding="ut

Android仿网易一元夺宝客户端下拉加载动画效果(一)

上上周写的一个demo,仿照网易一元夺宝的下拉刷新效果. 原效果是(第一部分)一个小太阳拉下来,然后松开回弹上去, (第二部分)再掉下来一个硬币进行中轴旋转. 本文实现的效果的是第一部分的,效果演示图如下: Gif图看起来比较卡顿...其实真机演示效果还是很流畅的. 下面分析实现过程: 当时因为时间有限没有写在下拉刷新的组件中,也没有封装成一个单独的组件,只是在主布局后面写了一个View然后实现相应的操作,进行封装并不难,这里就不花时间BB了,下面是布局文件: <RelativeLayout x

SwipeRefreshLayout+RecyclerView实现上拉刷新和下拉刷新功能

SwipeRefreshLayout 是谷歌公司推出的用于下拉刷新的控件,SwipeRefreshLayout已经被放到了sdk中,在Version 19.1之后SwipeRefreshLayout 被放到support v4中. 源码在SDK\sdk\extras\android\support\v4\src\java\android\support\v4\widget\SwipeRefreshLayout.java 谷歌公司只提供了下拉刷新的功能,RecyclerView的出现基本就是为了替

PullToRefreshListView实现多条目加载上拉刷新和下拉加载

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 XML布局 主页面main布局 <com.handmark.pulltorefresh.library.PullToRefreshListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/pull" > <

iscroll-probe实现下拉刷新和下拉加载效果

需要注意的是外部wrapper的高度,以及all的高度,须是>100%. 附加一个css3 的loading .dengl-spinner { width: 0.682rem; height: 0.682rem; position: relative; position: absolute; z-index: -1; left: 50%; margin-left: -0.341rem; top: 2.5rem; } .dengl-spinner1{ width: 0.682rem; height

iOS仿抖音视频加载动画效果的实现方法

前言 这几天一直跟开源的抖音demo斗智斗勇,今天跟大家分享的是抖音中或者快手中加载视频的动画,这个加载效果还是挺实用,下面话不多说了,来随着小编一起学习学习吧 上图看成品 实现原理 首先我创建一个视图 @interface ViewController () @property (nonatomic, strong) UIView *playLoadingView; @end @implementation ViewController - (void)viewDidLoad { [super

iOS实现scrollview上拉显示Navbar下拉隐藏功能详解

本文主要介绍的是关于iOS中scrollview上拉显示Navbar下拉隐藏的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 动画效果: 关于下拉隐藏Nabbar,上拉显示,有三种方式:推崇第一种,但是做的还是没简书.知乎那样流畅,第一种是对navbar做了平移,第二种,第三种都是隐藏.. 方法如下: 第一种,和第二种处理时机一样,但是效果更好,并没有处理Navbar 的隐藏. -(void)scrollViewWillBeginDragging:(UIScrollView *)scr

iOS实现顶部标签式导航栏及下拉分类菜单

本文实例为大家分享了iOS实现顶部标签式导航栏及下拉分类菜单的全部过程,供大家参考,具体内容如下 当内容及分类较多时,往往采用顶部标签式导航栏,例如网易新闻客户端的顶部分类导航,最近刚好有这样的应用场景,参考网络上一些demo,实现了这种导航效果,记录一些要点. 效果图(由于视频转GIF掉帧,滑动和下拉动画显得比较生硬,刚发现quickTime可以直接录制手机视频,推荐一下,很方便) 1.顶部标签式导航栏 (1)实现思路 其实就是在上下两个UIScrollView上做文章,实现联动选择切换的效果

Android实现第三方登录的上拉展开,下拉隐藏,下拉隐藏示例

Android的UI和交互是很重要的一部分,直接影响到用户对软件的体验.随着项目经验的积累,发现Android中动画的运用越来越重要.本篇文章抽出了项目登录界面中实现的第三方登录,用户可以上拉展开,下拉隐藏第三方登录这么一个效果,提高用户和软件的交互性. 实现效果: (1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q