关于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的时候,就说明你的放大镜底部已经移动纸的底部了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

jquery 实现滚动条下拉时无限加载

思路: 通过捕捉浏览器滚动条下拉事件,触发异步加载数据的js方法,实现数据的动态添加。 脚本:    var lastId=0;//记录每一次加载时的最后一条记录id,跟您的排序方式有关。...

【iOS】UITableView的上拉加载更多和下拉刷新原理

在iOS的实际项目中,我们会使用一些第三方库。其中使用较为频繁的一个就是上拉加载更多下拉刷新类的。比如MJRefresh和JHRefresh。一般小公司都是使用就够了,可以满足我们的项目需求即可。但是...

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

UITableView(三)本文主要内容: UITableView下拉刷新、上拉加载的实现。实现的效果如下: 实现方式:使用MJRefresh框架。关于MJRefresh框架:MJRefres...

iOS UITableView下拉刷新上拉加载更多EGOTableViewPullRefresh类库使用初级剑侠篇(欢迎提建议和分享遇到的问题)

这篇文章说下:MJRefresh和  EGOTableViewPullRefresh 的使用方法最下面有原理说明,若有不对或者建议请评论指出,先谢谢了: 首先是英文原文和类库下载地址:https:/...

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五)

IOS上拉刷新及自动加载更多,不需要上拉加载更多,直接就翻到下面就自动加载更多! 喜欢的话到我博客留个言吧,感谢:http://blog.csdn.net/xiaoyuan511 新手,大神勿喷。求共...

iOS UITableView 的下拉刷新和上拉加载的实现

iOS UITableView 的下拉刷新和上拉加载的实现 我从事iOS软件开发已经有两年多的时间,开发的每一款App都用到UITableView 来展示数据,从而有的地方也用到UITable...

android Listview下拉滚动时自动加载数据

最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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