美文网首页
uicollectionview、uitableview重用相关

uicollectionview、uitableview重用相关

作者: WSGNSLog | 来源:发表于2016-10-25 18:29 被阅读190次

    uicollectionviewcell、uitableviewcell有重用问题,同样分组的头视图也会出现重用.工程里自定义cell(uicollectionview、uitableviewcell)时,cell里的控件可能是在cellForItemAtIndexPath里添加的,在cellForItemAtIndexPath里给cell添加内部控件,复用时,当前的cell可能会与滑出屏幕外面的cell内部控件重叠。分区头视图同理。

    通用解决方法:
    只要判断cell或者headerView的内部子视图是不是nil,然后非nil时移除最后一个子视图。

    以分区头视图为例:

     (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
    {
    if (kind == UICollectionElementKindSectionHeader) {
        UICollectionReusableView *header = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:HeaderID forIndexPath:indexPath];
        SectionModel *secModel = self.dataSource[indexPath.section];
        
        if (header.subviews.lastObject!=nil) {
            [header.subviews.lastObject removeFromSuperview];
        }
        UILabel *sectionTitleLabel = [[UILabel alloc]initWithFrame:CGRectMake(15, 10, 200, 30)];
        sectionTitleLabel.text = @"I am the header";
        sectionTitleLabel.font = [UIFont systemFontOfSize:17];
        [header addSubview:sectionTitleLabel];
        return  header;
        
    }else if(kind == UICollectionElementKindSectionFooter){
    
        UICollectionReusableView *footer = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:FooterID forIndexPath:indexPath];
        return  footer;
    }else{
        return nil;
    }
    }
    

    cell解决方法:

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        UITableViewCell *cell=nil;
        static NSString *reuse=@"cell";
        if (cell==nil) {
            cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuse] autorelease];
          }else{
              if ([cell.contentView.subviews lastObject] != nil) {  
            [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];  //删除并进行重新分配
        }  
    }
    
    cell.textLabel.text=@"cell";
    
    return cell;
    

    }

    当然了,如果cell或者headerView是自定义的,而且内部控件是在cell或者headerView创建时(init方法里)添加的,在控制器里注册

    [_collectionView registerClass:[MMediaCollectionCell class] forCellWithReuseIdentifier:ID];
    [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:HeaderID];
    [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:FooterID];
    

    再使用 [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath]复用cell就没有重用问题了。

    相关文章

      网友评论

          本文标题:uicollectionview、uitableview重用相关

          本文链接:https://www.haomeiwen.com/subject/bonruttx.html