关于UITableView复用问题的3种解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于UITableView复用问题的3种解决方法相关的知识,希望对你有一定的参考价值。

最近在好多地方又遇到有人提tableview的复用问题,觉得还是说下自己的理解,希望能有帮助!

  之前就想写自己关于复用的想法,拖了这么久,又有人被困惑,所以就写了。

  事实上复用问题的本质是cell上面的控件的内容指针没有重指向、button事件重复添加等!

 比如:指针重指向:cell.textLabel.text = model.name;这个就是label上内容的指针重指向,所以只要model有东西,就不会出现问题;

 

解决方法1:model标记:

     (1) 从复用队列取出cell:

       InvesmentRedCell *cell = [tableView cellForRowAtIndexPath:indexPath];

     (2) 对当前显示的cell做一些处理,比如在点击的时候让其他cell中控件颜色变化等等:
        for (InvesmentRedCell *tempCell in _tableviewInvestmentRed.visibleCells)
        {
            tempCell.imgUse.highlighted = NO;
            
            tempCell.lblAmount.textColor = [UIColor colorWithRed:0.53 green:0.53 blue:0.53 alpha:1];
            
            tempCell.lblExpiredDate.textColor = [UIColor colorWithRed:0.53 green:0.53 blue:0.53 alpha:1];
        }

      (3)遍历数组,把model的选择状态改变
        for (MyWelfareModel *tempModel in _arrInvesmentRed)
        {
            tempModel.isSelect = NO;
        }

      (4) 正常处理点击后的状态:
        tempDataModel.isSelect = YES;
        cell.imgUse.highlighted = YES;
        cell.lblAmount.textColor = _selectedColor;
        cell.lblExpiredDate.textColor = _selectedColor;
        _couponId = tempDataModel.couponid;
        _selectedModel = tempDataModel;
        NSInteger amount = [_amountCell.valueTextFied.text integerValue] - _selectedModel.amount.integerValue;
        if (amount >= 0) {
            _strInputAmout = [NSString stringWithFormat:@"%ld",(long)amount];
        } else {
            _strInputAmout = @"0";
        }
解决办法2:移除点击事件重新添加
    (1)取出复用队列中的cell

    VideoDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifer forIndexPath:indexPath];
    
    VideoDetailModel *model = self.modelArray[indexPath.row];
    cell.model = model;

    (2)移除取出cell上的button点击事件
    [cell.like removeTarget:self action:@selector(likeButton:) forControlEvents:UIControlEventTouchUpInside];

    (3)重新添加事件
    [cell.like addTarget:self action:@selector(likeButton:) forControlEvents:UIControlEventTouchUpInside];
    cell.like.tag = 2000+indexPath.row;
    
    return cell;

 

解决办法3:使用block解决:

(1)cell中声明一个block属性

  @property (nonatomic, copy) void (^moreButtonClickedBlock)(NSIndexPath *indexPath);

(2)cell中添加button事件

    _moreButton = [UIButton new];
    [_moreButton setTitle:@"显示全部" forState:UIControlStateNormal];
    [_moreButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [_moreButton addTarget:self action:@selector(moreButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    _moreButton.titleLabel.font = [UIFont systemFontOfSize:14];

(3)button点击事件

- (void)moreButtonClicked
{
    if (self.moreButtonClickedBlock) {
        self.moreButtonClickedBlock(self.indexPath);
    }
}

(4)布局cell时

        DemoVC9Cell *cell = [tableView dequeueReusableCellWithIdentifier:kDemoVC9CellId];

   ||记得传入点击位置,在第三步block回传
    cell.indexPath = indexPath;
    __weak typeof(self) weakSelf = self;
    if (!cell.moreButtonClickedBlock) {
        [cell setMoreButtonClickedBlock:^(NSIndexPath *indexPath) {
            Demo9Model *model = weakSelf.modelsArray[indexPath.row];
            model.isOpening = !model.isOpening;
            [weakSelf.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }];
    }
    cell.model = self.modelsArray[indexPath.row];
    return cell;

 

以上是关于关于UITableView复用问题的3种解决方法的主要内容,如果未能解决你的问题,请参考以下文章

关于多媒体编解码器的概念(容器、格式、编解码器、复用器、解复用器)[关闭]

uitableview 关于键盘挡住输入框解决方法

UITableView 中如何复用单元格?

关于UITableview刷新笔记

快速回顾,浅谈mvc思想

为 UDP 模拟 accept()(设置解复用 UDP 套接字的时间问题)