UITableView套UITableView数据刷新

96
codeShuai
2017.11.11 18:07* 字数 224
网上关于tableview嵌套tableview的文章很多,纵览很多后发现有两点没有满足需求
  • 把两个tableview放在一个控制器中这样对大批量的数据处理不够友好
  • 没有做到tableview互斥滚动(只有一个可以滚动)
主要的一点

在父控制器的tableview的GSTableview.m文件中实现这个方法

/**
 同时识别多个手势
 
 @param gestureRecognizer gestureRecognizer description
 @param otherGestureRecognizer otherGestureRecognizer description
 @return return value description
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
实现的原理是
    1. 当子控制器中的tableview偏移量<=0 的时候让这个tableview不能滚动 代码表示为 scrollView.contentOffset = CGPointZero; 并且通知父控制器可以滚动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSLog(@"scrollView.contentOffset.y===   %f",scrollView.contentOffset.y);
    // 只有控制这个tableview的滑动才可以 实现下拉刷新 所以设置scrollView.contentOffset = CGPointZero
    // 向下拖动  scrollView.contentOffset.y 值小于零
    //  vcCanScroll 从上一个控制器传递过来

    if (!_vcCanScroll) {
       scrollView.contentOffset = CGPointZero;
        
    }
    if (scrollView.contentOffset.y <= 0) {
        _vcCanScroll = NO;
        // 到顶通知父视图改变状态  用于有多个同级的控制器  用来设置所有控制器中的tableview 偏移量设置为 CGPointZero  还有就是设置父控制器中tableview的  canScroll;
         scrollView.contentOffset = CGPointZero;
        [[NSNotificationCenter defaultCenter] postNotificationName:@"leaveTop" object:nil];
        
    }

    // 设置是否显示垂直滚动条 VerticalScrollIndicator
    self.tableView.showsVerticalScrollIndicator =_vcCanScroll?YES:NO;
    
}

父控制器在接受到通知执行的操作

- (void)changeSrollStatus{
通知让父控件可以滚动
    self.canScroll = YES;
}
    1. 当父控制器可以滚动的时候 设置子控制器中tableview 不能滚动 代码中是通过设置属性来实现的 self.childViewController.vcCanScroll = YES;
      父控制器的scrollviewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGFloat bottomCellOffset = [_gsTableView rectForSection:1].origin.y - 64;
    if (scrollView.contentOffset.y >= bottomCellOffset) {
        scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
        
        if (self.canScroll) {
            self.canScroll = NO;
            self.childViewController.vcCanScroll = YES;
          
        }
    }else{
        if (!self.canScroll) {
            scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
        }
    }
    self.gsTableView.showsVerticalScrollIndicator = _canScroll?YES:NO;
}

  • 子控制器中设置
- (void)setVcCanScroll:(BOOL)vcCanScroll{
    _vcCanScroll = vcCanScroll;

}

代码地址

OC学习
Web note ad 2