默认选中一行或多行是一个常用的功能,但是在使用的时候经常会碰到各种问题,比如我们需要默认选中第一行,在viewDidLoad方法中,添加以下代码,
代码片段1
NSIndexPath *ip=[NSIndexPath indexPathForRow:0 inSection:0];
[tableView selectRowAtIndexPath:ip animated:YES scrollPosition:UITableViewScrollPositionBottom];
在tableview:cellForRowAtIndex:的代理方法中添加如下代码:
代码片段2
cell.accessoryType = cell.selected ? UITableViewCellAccessoryTypeNone: UITableViewCellAccessoryTypeCheckMark;
之后,发现在界面上并未选中第一行。打印发现cell.selected是NO.
其实这里有一个误区:选中的并不是cell,而是table的indexPath。table有一个属性indexPathsForSelectedCell
,是一个数组,里面装的是table选中的indexPath。只要在代码片段1之后任意位置,打印此属性,就会发现第一行已经被选中。理解了这个点,问题就好解决了。只要修改代码片段2为如下:
NSIndexPath *selectedIndexPath =[ [tableView indexPathsForSelectedCell] firstObject];
cell.accessoryType = cell.selected ? UITableViewCellAccessoryTypeNone: UITableViewCellAccessoryTypeCheckMark;
cell.accessoryType = indexPath ==selectedIndexPath ? UITableViewCellAccessoryTypeNone: UITableViewCellAccessoryTypeCheckMark;