关于UITableView上拉或下拉时加载数据思路

原创 2013年12月04日 09:32:03

       这两天上班一直看别人的代码,由于学了一个月ios才上手,对于上拉或下拉,tableView动态请求数据的实现不了解,摸索了两天,终于搞明白了。

       众所周知,UITableView本身也是个UIScrollView,而UIScrollViewDelegate声明的一些协议当然也就被UITableView遵守。其中下面这个方法实现数据动态加载很重要:

    -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSLog(@"scrollViewDidEndDecelerating");
}

开始不知道这个方法什么时候调用,debug之后发现,当你划过tableView,tableView快速移动并逐渐减速,当停止的时候会被调用,也就是didEndDecelerating(完全结束减速)的时候会被调用。值得注意的是,你一直用手拖着tableView后释放,是不会触发的,但是有两种情况例外,一种是下拉超过tableView的第一行,另一种是上拉超过tableView的最后一行。为什么这两种方式会触发scrollViewDidEndDecelerating:消息呢,因为两种都有一个共性,就是当你拖拽超过范围,释放手势时tableView会自动回弹,这个回弹结束之后就会调用scrollViewDidEndDecelerating:消息。明白这一点再加上下面这个小知识就可以实现了。

    
这个indePathsForVisibleRows消息应该大家不会陌生,官方解释:Returns an array of index paths each identifying a visible row in the receiver.就是一堆当前使用的indexPath的数组。

     利用上述两个方法,假如data为tableView的数据源,上拉刷新数据基本实现如下(下拉同理):

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSArray* pathsArray = [(UITableView *)scrollView indexPathsForVisibleRows];
    if(pathsArray.count != 0){
        int rowSize = [[pathsArray objectAtIndex:(pathsArray.count-1)] row]+1;
        if (rowSize == 当前数据量 && rowSize < 数据总量) {
            [self loadata];
        }

    }

    这个是我目前解决不是用第三方开源框架大概的实现思路,大家可能也会发现点小问题,就是当你上拉划过tableView,只要tableView减速停止时最后一行可见,就会刷新数据,目前我还没有解决这个问题,这个也是写这篇文章才想到的,如有新发现,一定更新,本人才学ios,望大神勿喷。。。


    经过刚才的一番研究,想到了一种解决方案,就是利用加入偏移量判断来实现:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSArray* pathsArray = [(UITableView *)scrollView indexPathsForVisibleRows];
    if(pathsArray.count != 0){
        int rowSize = [[pathsArray objectAtIndex:(pathsArray.count-1)] row]+1;
        //tableView 内容的高度
        CGFloat tableViewHeight = self.tableView.contentSize.height;
        //tableView y轴的偏移量(这个contentOffset(偏移量)经测试过,是以tableView左上角为坐标原点,屏幕左上角相对坐标原点的坐标)
        //
        CGFloat y = self.tableView.contentOffset.y;
        //屏幕的高度
        CGFloat viewHeight =  self.view.bounds.size.height;
        if (tableViewHeight - y - viewHeight == 0 && rowSize < 数据总量) {
            UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:nil message:@"正在加载数据,请稍后。。。" delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil];
            [alertView show];
            //加载数据操作。。。
        }
    }
}
     这个思路就好比:tableView是一张纸,屏幕是放大镜,拿着放大镜看纸上的字,当你的纸的长度-你放大镜的高度-你放大镜移动的距离等于0的时候,就说明你的放大镜底部已经移动纸的底部了。

Tableview禁止下拉,允许上拉

1 回弹机制:bounces alwaysBounceHorizontal alwaysBounceVertical bounces:描述的当scrollview的显示超过内容区域的边缘以及返回时,是...

iOS - RxSwift 项目实战记录

最近刚刚把接手的OC项目搞定,经过深思熟虑后,本人决定下个项目起就使用Swift(学了这么久的Swift还没真正用到实际项目里。。。),而恰巧RxSwift已经出来有一些时间了,语法也基本上稳定,遂只...

tableView下拉刷新和上拉加载的原理

首先感谢原文作者的分享:http://blog.csdn.net/hmt20130412/article/details/32695305 在做App开发时,很多时候会用到下拉刷新和上拉加载,比如我...

IOS数据刷新(上拉刷新和下拉刷新)

总结:数据刷新的原理就是修改页码请求数据,数据加载前UI显示“正在加载数据”,数据加载完后UI显示“加载成功”,实际就是调用接口,只是参数页码的参数进行递增。 注意:使用前,需要倒入第三方包MBPr...

实现TableView的上拉加载和下拉刷新

项目开发过程中经常会用到tableview来加载网络数据,而经常要用到的一个功能就是下拉刷新,上拉加载更多。虽然有很多第三方框架可以使用,但是有时我们还是想自己手动定制来达到目的。 下面我们来具体看...

UITableView 分页显示、加载更多,数据源远程数据,解析JSON,以及iOS☞Category

在这篇里,我们要学习的目标: 1. 解析远程的JSON数据2. 分页显示数据3. 学习Category的使用 概述     IOS5.0开始支持JSON,所以不用第三方的解析了,主要...

IOS UI设计模式 - 分页

UI设计模式分为两种:分页模式 和 下拉刷新模式。   一、分页模式 根据触发方式的不同,请求分为主动请求和被动请求。 主动请求:当条件满足时,再次请求下一批数据,是自动发出的,并且一般在表...
  • tyinopx
  • tyinopx
  • 2015年07月13日 20:56
  • 809

IOS UITableView上拉刷新和下拉加载

  • 2016年08月12日 15:23
  • 76KB
  • 下载

上拉加载更多,下拉刷新实现思路

  • 2015年08月20日 16:18
  • 1.07MB
  • 下载

iOS UITableView(三)-下拉刷新、上拉加载

UITableView(三)本文主要内容: UITableView下拉刷新、上拉加载的实现。实现的效果如下: 实现方式:使用MJRefresh框架。关于MJRefresh框架:MJRefres...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于UITableView上拉或下拉时加载数据思路
举报原因:
原因补充:

(最多只允许输入30个字)