先看需求

ios 复杂的tableview ios tableview关闭cell复用_ios

如上图,需求需要在一堆复用的自定义cell中 点击一个cell 在当前cell显示选中按钮

如果单纯的在cell里添加Btn再在didselect方法中去修改按钮状态,那么就会出现别的cell中也出现了一个选中的按钮.

这是由于cell的复用导致的

为了避免这个情况,这里的思路就是,

1.在cell中添加按钮,并且为按钮添加代理方法返回控制器

2.为cell创建一个Model ,model里面除了常规的显示数据外,还要预留一个Index 用来标记每个cell中的Btn.tag (这样的好处是,即使UI中cell复用了,但是每次点击的cell中的btn.tag是唯一的)

3.为cell预留一个SelectArray数组公共属性,通过 [tbaleView reloadData];方法来设置按钮状态

@property (nonatomic,strong) NSMutableArray *selectArr;

4.在控制器的按钮代理方法中,通过一个全局数组来记录当前点击的cell中的btn.tag (这里的特点或则说局限就是,数组中每次都只存一个tag,这也导致了点击cell出现勾选之后,必须再次点击当前cell,取消选择)

#pragma mark TransferPayToolCellDelegate
-(void)showRightImageView:(UIButton *)btn cellDefulHeight:(CGFloat)cellDefunHeight cellAllHeight:(CGFloat)cellAllHeight{

    cellallHeight = cellAllHeight;
    celldefulHeight = cellDefunHeight;

    //存储状态
    selectBtn = btn;

    if ([self.selectedArray containsObject:@(btn.tag)]) {
        [self.selectedArray removeObject:@(btn.tag)];
    }else{
        [self.selectedArray addObject:@(btn.tag)];
    }
    NSLog(@"%@",self.selectedArray);

    [tbaleView reloadData];
}

5.cell里面对按钮状态的处理

-(void)setSelectArr:(NSMutableArray *)selectArr{
    _selectArr = selectArr;

    if (_selectArr.count == 0) {
        leftImageView.hidden = YES;
        halfBgview.hidden = YES;

        btnner.selected = NO;
        btnner.userInteractionEnabled = YES;
    }
    for (int i = 0; i<_selectArr.count; i++) {
        if (btnner.tag == [_selectArr[i] integerValue]) {
            leftImageView.hidden = NO;
            halfBgview.hidden = NO;

            btnner.selected = YES;
            btnner.userInteractionEnabled = YES;
        }else{
            leftImageView.hidden = YES;
            halfBgview.hidden = YES;

            btnner.selected = NO;
            btnner.userInteractionEnabled = NO;
        }
    }

}

说了这么多废话,上代码吧

https://github.com/tianNanYiHao/transTableview.git