先看需求
如上图,需求需要在一堆复用的自定义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