zoukankan      html  css  js  c++  java
  • UITableView如何获取所有的cell

      

    查过文档,官方提供了– visibleCells 方法来获取所有可见的cell,但是仅限于获取当前能看到的,那些需要scroll才能看到的cell获取不到。
    于是想到自己写:

    复制代码
    1. -(NSArray *)cellsForTableView:(UITableView *)tableView
    2. {
    3.     NSInteger sections = tableView.numberOfSections;
    4.     NSMutableArray *cells = [[NSMutableArray alloc]  init];
    5.     for (int section = 0; section < sections; section++) {
    6.         NSInteger rows =  [tableView numberOfRowsInSection:section];
    7.         for (int row = 0; row < rows; row++) {
    8.             NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
    9.             [cells addObject:[tableView cellForRowAtIndexPath:indexPath]];
    10.         }
    11.     }
    12.     return cells;
    13. }



    但是问题还是存在,不在屏幕范围内的cell还是获取不到:比如说tableview中有10个cell,满屏可以显示5个。当loop到第六个cell的时候,获得是一个nil

    1.UITableViews存储他们的NSIndexPath。因此存在对部分没有对象。使用下面的代码就可以遍历表并执行的可见部分索引(我不知道你为什么想要看到的部分,因为他们看到,目前在屏幕上,但不管)。 
    for (NSIndexPath* i in [yourTableViewName indexPathsForVisibleRows])
    {
    NSUInteger sectionPath = [i indexAtPosition:0];
    //custom code here, will run multiple times per section for each visible row in the group
    }

    2.
    或者非常简单的方法是采取valueForKeyPath和的NSSet类的优势: NSSet *visibleSections = [NSSet setWithArray:[[self.tableView indexPathsForVisibleRows] valueForKey:@"section"]];

    基本上,你在可见的行的部分值的数组,然后填入一组与此删除重复。

    3.
    我已经得到了解决。 第一步,每个部分会显示,创建一个UIView- (UIView *)tableView:(UITableView
    *)tableView viewForHeaderInSection:(NSInteger)section,将被存储到数组中。
    当TableView中滚动,我想免费的无形剖面图,所以我需要知道哪些部分是可见或不可见,请按功能代码会检测这个目的,如果视图是可见的,然后释放它。 -(BOOL)isVisibleRect:(CGRect)rect containerView:(UIScrollView*)containerView
    {
    CGPoint point = containerView.contentOffset;
    CGFloat zy = point.y ;

    CGFloat py = rect.origin.y + rect.size.height;
    if (py - zy <0) {
    return FALSE;
    }
    CGRect screenRect = containerView.frame;

    CGFloat by = screenRect.size.height + zy ;
    if (rect.origin.y > by) {
    return FALSE;
    }
    return TRUE;
    }

    (rect是该部分的UIView;containerView是UITableView)
    通过这种方式,我可以得到的可见部分UITableView,但我希望在SDK可以用于此目的直接提供的API。

    4. 从可见的行列表中提取部分: NSArray *indexPathsForVisibleRows = [tableView indexPathsForVisibleRows];
    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
    for ( NSIndexPath *indexPath in indexPathsForVisibleRows ) {
    [indexSet addIndex:indexPath.section];
    }
    NSLog(@"indexSet %@",indexSet);
    // indexSet <NSMutableIndexSet: 0x11a5c190>[number of indexes: 5 (in 1 ranges), indexes: (9-13)]

    或: NSArray *indexPathsForVisibleRows = [detailTableView indexPathsForVisibleRows];
    NSMutableSet *sectionSet = [NSMutableSet set];
    for ( NSIndexPath *indexPath in indexPathsForVisibleRows ) {
    [sectionSet addObject:[NSNumber numberWithInt:indexPath.section]];
    }
    NSLog(@"sectionSet %@",sectionSet);
    // sectionSet {(13, 11, 9, 10, 12 )}

    5. 另一种解决方案,可以使用在你的节头视图中的标签1位,这样的 #define _TBL_TAG_SECTION(_TAG) ((_TAG)|(1<<30))
    #define _TBL_TAG_CLEAR(_TAG) ((_TAG)&((1<<30)-1))
    #define _TBL_TAG_IS_SECTION(_TAG) ((_TAG)>>30)

    - (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
    // alloc header view
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
    header.tag = _TBL_TAG_SECTION(section);
    return header;
    }

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
    CGRect r = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y,
    CGRectGetWidth(scrollView.frame),
    CGRectGetHeight(scrollView.frame));
    for (UIView *v in [_tableView subviews]) {
    if ( CGRectIntersectsRect(r, v.frame) ) {
    if ( _TBL_TAG_IS_SECTION(v.tag) ) {
    NSLog(@"visible section tag %d", _TBL_TAG_CLEAR(v.tag));
    }
    }
    }
    }

    6. 2步解决方案,以获得在一个UITableView可见部分:
    1)添加标题视图一个可变数组viewForHeaderInSection2)更新数组时,在滚动的tableviewscrollViewDidScroll注Tag属性来保存部分的数量
    @property (nonatomic, strong, readwrite) NSMutableArray *headerArray;

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 40)];
    headerView.backgroundColor = [UIColor greenColor];
    headerView.tag = section;
    [_headerArray addObject:headerView];
    return headerView;
    }

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self updateHeaderArray];
    NSLog(@"------------");
    for (UIView *view in _headerArray) {
    NSLog(@"visible section:%d", view.tag);
    }
    }

    - (void)updateHeaderArray {
    // remove invisible section headers
    NSMutableArray *removeArray = [NSMutableArray array];
    CGRect containerRect = CGRectMake(_tableView.contentOffset.x, _tableView.contentOffset.y,
    _tableView.frame.size.width, _tableView.frame.size.height);
    for (UIView *header in _headerArray) {
    if (!CGRectIntersectsRect(header.frame, containerRect)) {
    [removeArray addObject:header];
    }
    }
    [_headerArray removeObjectsInArray:removeArray];
    }

    7. 答案是简单了很多,并用简洁KVC NSArray *visibleSections = [self.tableView.indexPathsForVisibleRows valueForKey:@"section"];

    这可能给你重复的值的数组,但你可以从那里管理。
  • 相关阅读:
    css常用标签
    关于手机端html的学习
    Vue_按键修饰符
    http_http协议简要概括
    nodejs_fs模块相关练习1
    nodejs_fs模块常用方法
    Vue_组件传值_非父子组件间的传值
    Vue_组件传值_子组件通过事件调用向父组件传值
    Vue_组件传值_父组件向子组件传值
    Vue_使用ref获取DOM元素
  • 原文地址:https://www.cnblogs.com/allanliu/p/4465526.html
Copyright © 2011-2022 走看看