优雅的实现TableViewCell单选

iOS,前端开发

Posted by oragekk on January 12, 2018

最近有些忙,好久没有写博客了。 分享一个cell做单选的思路

可行的思路

  1. 在tableview的控制器中设立一个变量记录选择的indexPath,点击cell之后刷新表格来和现有indexPath对比
  2. 和第一种大同小异,做一个和dataArr同样的数组,记录indexPath,循环确定当前cell是否为选中cell
  3. 利用cell的- (void)setSelected:(BOOL)selected animated:(BOOL)animated方法

利弊分析

  1. 前两种,都需要在didSelectRowAtIndexPath方法中来刷新表格,可能会造成不必要的滑动,而且需要单独的外在属性来记录这个选择
  2. 第三种方法是我要介绍的,不用任何外在属性,不用变量,不用数组。实现cell、或cell中Button的单选。并且不会因为复用而造成位置错乱,如果要实现cell的多选可以参考我之前的文章Cell的accessoryType属性标记单元格之后,出现的重用问题

实现方式

  1. 如果要有默认选择在初始化tableView完成后写

     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
     [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
    
  2. 然后在cell中实现- (void)setSelected:(BOOL)selected animated:(BOOL)animated方法

     - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
     [super setSelected:selected animated:animated];
     	if (selected) {
         	self.selBtn.selected = YES;
     	}else {
         	self.selBtn.selected = NO;
     	}
     }
    
  3. didSelectRowAtIndexPath方法中给点击的cell手动选中,并不需要刷新表格

     [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
    

至此结束,可以看一下效果 效果图.md.gif