tableView分页,上下拉刷新

作者:Love@YR
链接:http://blog.csdn.net/jingqiu880905/article/details/52180092
请尊重原创,谢谢!

demo 地址
demo运行view白着,需要下拉有数据,然后再上拉。

也许是app里最常用的功能了,总结下~
先上代码:

发请求:

pageIndex isRequest hasLoadAll来控制是否第一次加载

[self prizeRequest:YES];
//isFirstLoad第一次加载。先在页面中间加载个activity indicator
- (void)prizeRequest:(BOOL)isFirstLoad{
    if (isFirstLoad) {
        [CTLoadingView startLoadingInView:self.view token:@"prizeRequest"];
        [prizeCounseAry removeAllObjects];//清空tableview数据源
        prizeIndex=0;//第一页
        prizeIsRequest=NO;//没有正在请求
        prizeHasLoadAll=NO;//没有加载完毕
    }else{
        prizeCounseTableView.tableFooterView = [CTExtension loadingViewMessage:@"数据加载中..."];
        }
    if (prizeIsRequest) {
        return;//当正在请求时不再响应请求
    }
    prizeIsRequest = YES; //设置成正在请求
    NSMutableDictionary *dic=[NSMutableDictionary dictionary];
    [dic setObject:[NSNumber numberWithInt:prizeIndex*pagerPerPage] forKey:@"pagerOffset"];
    [dic setObject:[NSNumber numberWithInt:pagerPerPage] forKey:@"pagerPerPage"];

    [CTBaseSender GetWithUrl:URL_GET_REWARD_SEARCH andRequestDic:dic fromPage:self success:^(id responseObject) 
    {
      [CTLoadingView stopLoadingInView:self.view token:@"prizeRequest"];
      NSMutableDictionary *responseDict = (NSMutableDictionary*)responseObject;
      NSInteger recordCount = [[responseDict objectForKey:@"courses"] count];
      if (recordCount > 0) {//有数据
         if (prizeIndex==0) {//第一次请求先清空下
              [prizeCounseAry removeAllObjects];
           }
           //第一次或非第一次累加数据源
          [prizeCounseAry addObjectsFromArray:[responseDict objectForKey:@"courses"]];
          [prizeCounseTableView reloadData];
          prizeIndex++;//index++
         prizeCounseTableView.tableFooterView = nil;
         prizeHasLoadAll=NO;//只要recordCount>0就代表后面可能还有数据
    }else{//已经没有数据了,请求完了
         if ([prizeCounseAry count]==0){//总共都没拉到数据
        prizeCounseTableView.tableFooterView = [CTExtension loadingViewMessage:@"没有有奖球场数据!"];
        }
        else{
        prizeCounseTableView.tableFooterView = [CTExtension loadingViewMessage:@"没有更多数据了!"];
        }
        prizeHasLoadAll=YES;//已经请求完毕了
     }
      prizeIsRequest=NO;//可以把正在请求的状态置为NO再接下个请求了
   }
 failure:^(NSError *error, id errorMessage) {
 [CTLoadingView stopLoadingInView:self.view token:@"prizeRequest"];  
prizeCounseTableView.tableFooterView = [CTExtension loadingViewMessage:NET_ERROR_NO_NET];
 prizeIsRequest=NO; //可以把正在请求的状态置为NO再接下个请求了
 }];

}

上滑触发:
这个例子是有两个tableview加入到一个tag为101的scrollView了,以便左右滑动,上方还有TabBar来选择选项卡

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (scrollView.tag != 101 && scrollView.contentOffset.y>0) 
    { //保证上滑tableview时继续request而下拉不做动作
        float tabHeight = scrollView.contentSize.height;
        if (tabHeight - scrollView.contentOffset.y < scrollView.frame.size.height)
        {
            if (selectIndex == 11)//选中了哪个tab
           {
                if (!nearIsRequest&&!nearHasLoadAll)
                {
                    [self nearRequest:NO];
                }   
            }
            else
            {
                if (!prizeIsRequest&&!prizeHasLoadAll)
                {
                    [self prizeRequest:NO];//NO代表这是上滑
                }
            }
        }
    }
}

当tableview的contentsize.height-offset.y+inset.bottom=frame.size.height时说明tableview滑到底了~~

关于上下拉刷新:

主要是scrollViewDidScroll,scrollViewDidEndDragging这两个方法。

下拉刷新是首先手动scroll(即drag)到那个下拉刷新的显示view出现,然后scroll到其完全暴露,甚至已经超过其frame还在下拉,最后停止drag。分别让其显示提示信息为下拉刷新,释放立即刷新,更新数据中,请稍等…

当scrollViewDidEndDragging的时候,释放刷新,如果释放的那刻contentoffset<=-headerview的高度,且没有正在发请求,则开始请求第一页数据。

请求数据的过程中tableview自主向上滑动,此时contentoffset>-headerview的高度,如果正在请求,把其contentInset设置成headerview的高度则不再向上滑了,不继续走scrollViewDidScroll。

当请求结束的时候,把contentInset再设置回来,这样tableview就会滑到初始的inset为0。
上拉刷新主要就是设置tableview的tableFooterView

PS: tableview addsubview的subview的坐标是以contentview来作为参考的。
比如一个tableview的frame为(0,25,self.view.frame.size.width,400);
其contentInset为(10,0,0,0)
则其add的subview的frame为(0,-35,self.view.frame.size.width,35)的话则恰好此view从整个self.view的最顶端到tableview内容视图开始显示的起点。所以说,这里记得把contentInset考虑进去。

contentOffset指的是内容视图的起点离frame的起点的偏移量。所以一旦contentInset的top值有的话,则初始下拉的时候offset就是-contentInset了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值