今天分享一个比较常用的知识点,点击某个UITableViewCell不执行-[UITableView didSelectRowAtIndexPath:]方法的几种方式:

  • 可以直接设置cell.userInteractionEnabled = NO

  • 可以实现UITableViewDelegate中的-[UITableView shouldHighlightRowAtIndexPath:]方法,设置对应indexPath返回NO;

  • 可以实现UITableViewDelegate中的-[UITableView willSelectRowAtIndexPath:]方法,设置对应indexPath返回nil,不过这种方式cell还是会有高亮效果,需要手动设置对应cell.selectionStyle = UITableViewCellSelectionStyleNone

以上三个方法,都不会进UITableViewDelegate的-[UITableView didSelectRowAtIndexPath:]方法。用第一种方式设置后,cell上的所有子View都不能被点击了;而第二种方式不会影响cell的子View的响应事件的传递,如果cell上有UIControl的子类,依然可以被点击;第三种方式也不会影响cell的子视图的响应事件,但是需要额外设置不显示高亮效果。当然,你也可以在-[UITableView didSelectRowAtIndexPath:]方法的对应indexPath直接return,只要你高兴😂,可以根据实际情况选择合适的方法。

有更优雅的方式,欢迎一起讨论。