关闭

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

标签: ios应用上拉下拉加载数据
1618人阅读 评论(0) 收藏 举报
分类:

       这两天上班一直看别人的代码,由于学了一个月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的时候,就说明你的放大镜底部已经移动纸的底部了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31294次
    • 积分:546
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:14篇
    • 译文:0篇
    • 评论:0条