IOS 视图跳转/层级相关的知识

iOS TableView的单元格实现单选功能

2016-07-02  本文已影响6214人  Spring_Lau

我最近在做的一个项目中遇到了单元格单选的功能,当时我的第一想法是在单元格上添加按钮,通过点击改变按钮的背景图片并记录最后一次点击的indexPath,因为之前的项目中遇到过多选的功能,用这种方法出现了复用的问题,也就是选择某个单元格滑动表格时没点击的单元格也被选中了,所以当时就很担心单选的时候出现同样的问题,果不其然,只显示最后一个单元格被选中。然后我找到了这种方法,总结了一下

这个功能的实现只需要在两个方法中code即可

首选我们公开一个属性

@property(nonatomic,strong)NSIndexPath *lastPath;

主要是用来接收用户上一次所选的cell的indexpath

第一步:在cellForRowAtIndexPath:方法中实现如下代码

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

NSInteger row = [indexPath row];

NSInteger oldRow = [lastPath row];

if (row == oldRow && lastPath!=nil) {

//这个是系统中对勾的那种选择框

cell.accessoryType = UITableViewCellAccessoryCheckmark;

}else{

cell.accessoryType = UITableViewCellAccessoryNone;

}

}

第二步:在didSelectRowAtIndexPath:中实现如下代码

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

//这里最好不要声明int类型的,个人建议

NSInteger newRow = [indexPath row];

NSInteger oldRow = (self .lastPath !=nil)?[self .lastPath row]:-1;

if (newRow != oldRow) {

UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];

newCell.accessoryType = UITableViewCellAccessoryCheckmark;

UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:lastPath];

oldCell.accessoryType = UITableViewCellAccessoryNone;

self .lastPath = indexPath;

}

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

Ok,可以收工了,这样实现之后的效果是每次单击一个cell会做一个选中的标志并且托动表视图时也不会出现checkmark的复用

不过,根据项目需求,可能会需要定义一个按钮,自定义选择框的图片,这也很简单,只需要将上面的代码改一下就ok了:

在cellForRowAtIndexPath:中如下修改

if (row == oldRow && self.lastPath!=nil) {

[cell . selectBtn setBackgroundImage:[UIImage imageNamed:@"选中点"] forState:UIControlStateNormal];

}else{

[cell . selectBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];

}

在didSelectRowAtIndexPath:中如下修改

if (newRow != oldRow) {

self.cell = [tableView cellForRowAtIndexPath:indexPath];

[self .cell.selectBtn setBackgroundImage:[UIImage imageNamed:@"选中点"] forState:UIControlStateNormal];

self.cell = [tableView cellForRowAtIndexPath:self .lastPath];

[self .cell.selectBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];

self .lastPath = indexPath;

}

上一篇下一篇

猜你喜欢

热点阅读