前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS UITableView 滑动到底部加载更多数据

iOS UITableView 滑动到底部加载更多数据

作者头像
码客说
发布2019-10-22 14:30:54
2.3K0
发布2019-10-22 14:30:54
举报
文章被收录于专栏:码客

前言

很多APP都是滑动到底部时点击加载更多才会加载数据,这样用户体验就会有间断感,所以我们想用户看到最后时自动加载数据 怎么做呢

有人会说用一下的这个方法

代码语言:javascript
复制
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

}

这种方法没法实现的 这种方法确实能判断滑动到最后 但是加载数据时 这个方法又回被调用 造成无限循环 所以不建议使用

这里我使用的是这个方法

代码语言:javascript
复制
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

}

具体代码

定义一个全局变量 @property(nonatomic)bool isLoading; 来标示是否正在加载数据 然后根据滑动的高度做判断 看是否滑动到了底部

代码语言:javascript
复制
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.bounds;
    CGSize size = scrollView.contentSize;
    UIEdgeInsets inset = scrollView.contentInset;
    CGFloat scrollViewHeight = bounds.size.height;
    CGFloat currentOffset = offset.y + scrollViewHeight - inset.bottom;
    CGFloat maximumOffset = size.height;
    
    CGFloat minSpace = 5;
    CGFloat maxSpace = 10;
    bool isNeedLoadMore = false;
    //上拉加载更多
    //tableview 的 content的高度 小于 tableview的高度
    if(scrollViewHeight>=maximumOffset){
        CGFloat space = currentOffset - scrollViewHeight;
        if(space>minSpace && space <maxSpace){
            isNeedLoadMore = true;
        }
    }else{
        //当currentOffset与maximumOffset的值相差很小时,说明scrollview已经滑到底部了。
        CGFloat space = currentOffset - maximumOffset;
        if(space>minSpace && space <maxSpace){
            isNeedLoadMore = true;
        }
    }
    
    if(!self.isLoading && isNeedLoadMore){
        self.isLoading = true;
        NSLog(@"-->加载更多数据");
        [self loadMore];
    }
}

但是有这样一个问题 如果已经确认没有更多数据的时候 我们会在加载更多的方法里直接设置self.isLoading = false; 但是由于视图动画还在滑动就会反复触发加载更多的方法 解决方法就是延迟设置self.isLoading = false;

代码语言:javascript
复制
[SVProgressHUD showErrorWithStatus:@"没有更多数据了"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [SVProgressHUD dismiss];
  self.isLoading = false;
});

这样就能确保不会多次加载了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 具体代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档