iOS tableView实现单选和多选
今天在项目中遇到了tableView的单选需求,现在总结一下,用一个简单的demo实现了简单的单选和多选两个功能.先看下效果图:
![](https://img.haomeiwen.com/i1103526/9dff83e504f79674.gif)
1:首先实现下单选
1:使用一个变量记录选中的行
@property(assign,nonatomic)NSIndexPath * selIndex; //单选选中的行
2:设置tableView数据,共2组,每组10行,
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
return2;
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
return10;
}
3:实现tableView的点击方法,每次点击记录点击的索引,取消之前的选择行,将当前选择的行打钩
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
//取消之前的选择
UITableViewCell*celled = [tableView cellForRowAtIndexPath:_selIndex];
celled.accessoryType =UITableViewCellAccessoryNone;
//记录当前的选择的位置
_selIndex = indexPath;
//当前选择的打钩
UITableViewCell*cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType =UITableViewCellAccessoryCheckmark;
}
4:列表滚动时,判断是否为选中的行,如果是cell是选中的那一行,就设置cell的accessoryType为UITableViewCellAccessoryCheckmark,到这里单选就实现完成了
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
staticNSString*cellid =@"cellid";
UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:cellid];
if(cell ==nil) {
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellid];
}
cell.textLabel.text = [NSStringstringWithFormat:@"第%zi组,第%zi行",indexPath.section+1,indexPath.row];
if(_selIndex == indexPath) {
cell.accessoryType =UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType =UITableViewCellAccessoryNone;
}
return cell;z
}
2:下面实现多选
1:使用一个数组记录选中的行
@property(strong,nonatomic)NSMutableArray*selectIndexs; //多选选中的行
2:使用一个变量判断是单选还是多选状态
@property(nonatomic,assign)BOOLisSingle; //单选还是多选
3:导航栏右侧按钮设置为单选和双选的切换按钮,并初始化多选记录数组
UIBarButtonItem*rightItem = [[UIBarButtonItemalloc]initWithTitle:@"多选"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(singleSelect)];self.navigationItem.rightBarButtonItem = rightItem;
//初始化多选数组
_selectIndexs = [NSMutableArraynew];
4:点击导航栏上的切换按钮切换单选还是多选状态
//单选还是多选按钮点击事件
-(void)singleSelect{
_isSingle = !_isSingle;
if(_isSingle) {
self.navigationItem.rightBarButtonItem.title =@"多选";
self.title =@"(单选)";
//切换为单选的时候,清除多选数组,重新加载列表
[self.selectIndexs removeAllObjects];
[self.tableView reloadData];
}else{
self.title =@"(多选)";
self.navigationItem.rightBarButtonItem.title =@"单选";
}
}
5:为tableView的点击方法中加上单选还是多选的状态判断,多选的话,将点击的行加入到多选索引数组中去,然后改变该行的cell.accessoryType,重复点击就做反操作
//选中某一行
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
if(_isSingle) { //单选
//取消之前的选择
UITableViewCell*celled = [tableView cellForRowAtIndexPath:_selIndex];
celled.accessoryType =UITableViewCellAccessoryNone;
//记录当前的选择的位置
_selIndex = indexPath;
//当前选择的打钩
UITableViewCell*cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType =UITableViewCellAccessoryCheckmark;
}else{ //多选
UITableViewCell*cell = [tableView cellForRowAtIndexPath:indexPath];
if(cell.accessoryType ==UITableViewCellAccessoryCheckmark) { //如果为选中状态
cell.accessoryType =UITableViewCellAccessoryNone; //切换为未选中
[_selectIndexs removeObject:indexPath]; //数据移除
}else{ //未选中
cell.accessoryType =UITableViewCellAccessoryCheckmark; //切换为选中
[_selectIndexs addObject:indexPath]; //添加索引数据到数组
}
}
}
6:在cellForRow代理方法中同样加入单选多选的判断,在滚动列表是加载列表,判断是否选中
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
staticNSString*cellid =@"cellid";
UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:cellid];
if(cell ==nil) {
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellid];
}
cell.textLabel.text = [NSStringstringWithFormat:@"第%zi组,第%zi行",indexPath.section+1,indexPath.row];if(_isSingle) { //单选
if(_selIndex == indexPath) {
cell.accessoryType =UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType =UITableViewCellAccessoryNone;
}
return cell;
}else{ //多选
cell.accessoryType =UIAccessibilityTraitNone;
for(NSIndexPath*indexin_selectIndexs) {
if(indexPath == index) {
cell.accessoryType =UITableViewCellAccessoryCheckmark;
}
}
}
return cell;
}