先发效果图:
做这个之前,我们必须先了解一下UITableView的执行顺序,这是非常必要的:
1-刷新的时候:
1.1 numberOfSectionsInTableView(确定有几组) -> numberOfRowsInSection(确定每组有多少的行) -> heightForRowAtIndexPath(确定每行cell的高度) 1.2 以上信息确定完毕后再依次调用cellForRowAtIndexPath -> heightForRowAtIndexPath 1.3 当滚动获取超出屏幕的cell 会再依次调用 cellForRowAtIndexPath -> heightForRowAtIndexPath
2- 点击的时候
didSelectRowAtIndexPath (点击的时候) numberOfSectionsInTableView (确定有多少组) numberOfRowsInSection (确定一组有多少行) heightForRowAtIndexPath (确定每行的高度) cellForRowAtIndexPath (行的样式是什么) heightForRowAtIndexPath (重新确定cell的行高)
接下来之后让我们走一下代码逻辑
1.首先我们先标记一个属性,选中的行NSIndexPath
/// 选中的行 @property (nonatomic, strong) NSIndexPath *selIndex;
2.我们对选中的行进行默认赋值,选中的是0组第0行
// 默认选中第一行 _selIndex = [NSIndexPath indexPathForRow:0 inSection:0];
3.我们就要考虑一下,当我们点击某一行时,上一次选中的行selIndex,打对勾的按钮图片要设置为空,让它不显示。而当前点击的行打对勾的按钮图片设置为对勾图片,让其显示。再把当前点击的行,就相当于目前选中的行,进行赋值。(didSelectRowAtIndexPath这个方法里执行下面代码)
//之前选中的,取消选择 JCMFoundDetailsAlertCell *celled = (JCMFoundDetailsAlertCell *)[tableView cellForRowAtIndexPath:_selIndex]; [celled.imageView setImage:[UIImage imageNamed:@""]]; [celled.markBtn setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; celled.leftLab.textColor = [UIColor colorWithHexString:@"#333333"]; //记录当前选中的位置索引 _selIndex = indexPath; //当前选择的打勾 JCMFoundDetailsAlertCell *cell = (JCMFoundDetailsAlertCell *)[tableView cellForRowAtIndexPath:indexPath]; [cell.markBtn setImage:[UIImage imageNamed:@"duigou_icon123"] forState:UIControlStateNormal]; cell.leftLab.textColor = [UIColor colorWithHexString:@"#fe2900"];
4.我们知道了,基本差不多了,但是还是不行,因为点击的时候也会调取cellForRowAtIndexPath方法,且,在上下滑动列表的时候,cell会出现复用,所以就需要在下面的方法再判断是谁打勾。(cellForRowAtIndexPath这个方法里执行下面代码)
// 上下滑动列表的时候,因为cell的复用,需要在下面的方法再判断是谁打勾if (_selIndex == indexPath) { // 当前选中的行 [cell.markBtn setImage:[UIImage imageNamed:@"duigou_icon123"] forState:UIControlStateNormal]; cell.leftLab.textColor = [UIColor colorWithHexString:@"#fe2900"]; }else{ // 非当前选中的行 [cell.markBtn setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; cell.leftLab.textColor = [UIColor colorWithHexString:@"#333333"]; }