博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】自定义UITableViewCell控件阻挡回调不到didSelectRowAtIndexPath的解决办法
阅读量:6239 次
发布时间:2019-06-22

本文共 1089 字,大约阅读时间需要 3 分钟。

原文网址:http://blog.talisk.cn/blog/2015/09/01/uitableview-didselectrowatindexpath-cannot-be-called-tips/

作为常用的控件,UITableView出现在了很多iOS App的各个地方,近期开发时遇到了一个问题,自定义Cell中嵌套了其他具有交互事件的控件,阻挡了Cell,导致无法回调didSelectRowAtIndexPath方法,最终得出解决办法。

一句话方案

将可能影响到Tap事件的控件的userInteractionEnabled属性设置为NO

1
[self.scrollView setUserInteractionEnabled:NO];

问题引出

为了在一个Cell中展示多个item,并且为了方便做分页处理,用UIScrollView再合适不过了,由于需要,只能将这个UIScrollView设置为全尺寸(scrollView的size和cell的size相同),由于scrollView本身具备events,所以点击cell的时候,tableViewdidSelectRowAtIndexPath无法响应。

像UIScrollView类似会引发这个问题的控件还有UITableViewUICollectionViewUITextField等等,当子视图的尺寸覆盖了整个cell,你就会发现无法回调didSelectRowAtIndexPath了。(当然如果子视图能不完全覆盖cell的话,点击未覆盖部分,还是可以正常回调的)。

原理

userInteractionEnabled是一个布尔类型值,当设置为YES的时候,控件可以接收交互事件,同一位置的交互事件,其父控件无法接收交互事件。正是由于iOS对交互事件如此的处理方式,才导致了Cell无法回调didSelectRowAtIndexPath的问题。当这个布尔值为NO时,交互事件由其父视图来处理,如果直到根视图都无法处理这个交互,则抛弃这个交互,除非某一视图能够处理这个交互。

后记

其实这还不是最好的解决方法,原因是,很多情况下,我们既需要父视图来响应交互事件,又希望子视图处理一些交互事件,可这个解决方案直接把子视图的交互一棒子打死了。例如,我们在Cell上加了一个ScrollView,我们希望当用户tap的时候,回调didSelectRowAtIndexPath,当swipe的时候,滚动scrollView。所以在这里加一个TODO:完美的解决方案『子视图与父视图分别处理不同交互』。

转载地址:http://nidia.baihongyu.com/

你可能感兴趣的文章
Git中的AutoCRLF与SafeCRLF换行符问题
查看>>
通过Process启动外部程序
查看>>
那些在django开发中遇到的坑
查看>>
cocos2dx lua 绑定之二:手动绑定自定义类中的函数
查看>>
IE CSS HACK
查看>>
北风设计模式课程---深入理解[代理模式]原理与技术
查看>>
php课程 4-14 数组如何定义使用
查看>>
winform托盘时,要运行一个实例,解决办法
查看>>
vagrant up 失败解决办法
查看>>
mysql AM/PM to 24 hours fromat
查看>>
远程唤醒UP Board
查看>>
网页打印
查看>>
Loading——spin.js
查看>>
Hadoop完全分布式环境搭建(四)——基于Ubuntu16.04安装和配置Hadoop大数据环境...
查看>>
Mule ESB工程的部署
查看>>
分离被碰撞物体, 求碰撞冲量
查看>>
js移动端 可移动滑块
查看>>
【kruscal】【最小生成树】poj3522 Slim Span
查看>>
jquery ajax提交表单数据的两种方式
查看>>
hdu 2102 A计划-bfs
查看>>