didSelectRowAtIndexPath未触发,已尝试Stack Overflow所有解决方案
解决UITableView didSelectRowAt方法未触发的问题
嘿,我太懂这种明明写了代理方法却毫无反应的憋屈感了!既然你已经试过Stack Overflow上的常规方案,那咱们再排查几个容易被忽略的细节,说不定就能找到症结:
检查方法签名的拼写细节
你贴的方法里_tableView这里少了个空格!Swift的代理方法参数标签是严格匹配的,正确的写法应该是_ tableView:(下划线和参数名之间必须有空格)。如果签名不对,系统根本识别不出这是UITableView的代理方法,自然不会调用。正确的方法签名应该是:func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 你的逻辑代码 }另外还要确认你的ViewController已经遵守了
UITableViewDelegate协议哦。排查TableView和Cell的交互开关
- 有没有不小心把tableView的
isUserInteractionEnabled设为false?这个属性关闭后,所有用户交互都会被禁用,点击事件根本传不到代理。 - 检查cell里的子视图:如果cell里有UIButton、UIScrollView这类占满整个cell的控件,且它们的
isUserInteractionEnabled是true,点击事件会被这些子视图拦截,不会触发tableView的选中方法。可以试试给这些子视图设置userInteractionEnabled = false(如果不需要它们响应交互的话)。
- 有没有不小心把tableView的
再次确认代理和数据源的绑定
虽然你可能已经试过,但再仔细核对一遍:- 代码层面:在
viewDidLoad里有没有明确设置tableView.delegate = self和tableView.dataSource = self? - Storyboard/XIB层面:如果是可视化创建的tableView,有没有在IB里把delegate和dataSource的连线拖到ViewController上?有时候连线会不小心断开,自己还没察觉。
- 代码层面:在
检查手势冲突
如果你的ViewController或者tableView上添加了其他手势识别器(比如UITapGestureRecognizer),可能会拦截tableView的点击事件。可以试试把手势的cancelsTouchesInView属性设为false,这样手势识别后不会阻止其他视图接收触摸事件;或者调整手势的优先级,让tableView的点击事件优先响应。
如果还是不行,你可以补充下tableView的创建方式(代码/IB)、cell的自定义情况,咱们再进一步排查!
内容的提问来源于stack exchange,提问作者Rajkumar Kumawat
相关产品推荐
相关产品推荐

