tableView默认选中某一行,[cell setSelected:YES animated:YES]

开发中,经常遇到一个页面两个tableView的情况,如图:

进入页面时默认选中左边的leftTableView的第一行"24h降水"这一行.实现这种效果比较方便的方式有两种思路:

思路都是基于通过cell的选中状态来控制label的字体颜色,cell的selected状态改变时,label的字体颜色自然也就会跟着变化

1.通过tableView层级控制cell的选中状态,即手动调用tableView的selectRowAtIndexpath方法:

[self.leftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

这种方式需要在tableView reloadData之后调用,效果是默认选中第一行数据.此外,由于右边的tableView数据是跟左边关联的,所以首次进入页面还需要手动请求一次数据,来刷新右边rightTableView.

需要注意的是:手动调用selectRowAtIndexPath并不会自动继续调用didSelectRowAtIndexPath代理方法.didSelectRowAtIndexPath方法一般只在手动点击cell的时候才会调用.(PS:苹果并不认为didSelectRowAtIndexPath由手动点击cell之外的方式触发是合理的)手动改变cell的selected状态也不会导致调用didSelectRowAtIndexPath

所以上面的代码还要加上一句,两句配合起来使用就能达到效果:

 

 [self tableView:self.leftTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]

在didSelectRowAtIndexPath方法中请求rightTableView的数据并reload rightTableView

 

2.通过cell层级控制cell的选中状态,即手动调用cell的setSelected方法:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    

    if([tableView isEqual:self.leftTableView]){

        if(indexPath.row==0){

 

            [cell setSelected:YES animated:YES];

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

 

        }

 

    }

 

}

需要注意的问题是:在cellForRow中调用cell的setSelected方法是没用的.虽然调用cell的setSelected方法会进入cell中去根据cell的selected设置label的颜色,但在这之后,又将自动调用一次cell的setSecleted方法,而且参数selected的值为NO,所以,即便刚刚设置了正确的label颜色,接下来又会被第二次自动调用的setSelected方法覆盖.最合适的调用时机是willDisplayRow代理方法中.

另外,在调用cell的setSelected方法后,还必须调用tableView的SelectRowAtIndexPath方法.否则你会发现这样一个问题,虽然进入页面时默认第一行cell选中了,但是你点击第二行时,第一行cell的选中状态并没有解除,而且打断点发现,连didDeselectRow方法也不进了.(PS:个人推测,tableView会对cell的选中状态做统一处理,didSelectRowAtIndexPath和didDeselectRowAtIndexPath成对出现才能合理控制cell的selected状态)

 

综上,最合理的办法就是第一种思路,在控制器层级控制cell的selected状态,即:

 

        [self tableView:self.leftTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

  [self.leftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值