为啥 UITableViewRow 需要长按才能触发 segue?

Posted

技术标签:

【中文标题】为啥 UITableViewRow 需要长按才能触发 segue?【英文标题】:Why would a UITableViewRow require a long press to trigger a segue?为什么 UITableViewRow 需要长按才能触发 segue? 【发布时间】:2017-09-05 21:10:08 【问题描述】:

我的 UITableview 位于一个容器内(需要嵌入 segue,因此我可以使用静态表格视图单元格),并且父视图控制器的父级是 UIViewcontroller 容器。

为什么表格视图上的一行需要长按才能触发转场?

如果我删除父 UIViewcontroller 容器,那么它可以正常工作。

【问题讨论】:

很难说。但是对我来说,有一次添加的(点击)手势识别器与表格视图冲突,导致您描述的类似。 是的,就是这样。我将如何赋予 tableview 优先级? 在我的情况下,我删除了手势识别器,因为它不应该在 tableview 可见时出现。对你来说,这看起来像是你需要的答案***.com/questions/8192480/… 是的,这就是我所做的。顶层视图控制器容器是一个登录屏幕,点击识别器将关闭它。所以我只在登录屏幕可见时才启用它。 【参考方案1】:

延迟可能是为了检测您触摸了哪个子视图而产生的延迟。

当您触摸应用程序窗口中的任何位置时,应用程序的窗口会调用视图层次结构中最顶层视图上的hitTest:withEvent: 方法,该方法会递归调用其子视图的hitTest:withEvent: 以最终检测实际的视图接收并处理触摸事件。所以基本上视图控制器中的子视图数量越多,实际视图响应的延迟就越多。对hitTest:withEvent: 的递归调用返回有点延迟,这就是您看到延迟的原因。 删除您的父视图控制器不会增加太多延迟,因为您减少了视图控制器的子视图数量。此外,当涉及更多滚动视图(或通常更多子视图)时,您可以使用 UIResponder 遍历更多子视图以返回处理触摸事件的视图。

【讨论】:

与顶视图上的水龙头识别器冲突。延迟太慢,不是处理时间造成的。 是的,就是这样。

以上是关于为啥 UITableViewRow 需要长按才能触发 segue?的主要内容,如果未能解决你的问题,请参考以下文章

android listview上下滑动时为啥不触发点击事件

百度地图手机端单触点单击和长按事件,解决部分手机(小米手机)地图单击事件失效,多触点拖动依然触发长按的bug

Android:为啥长按也会触发正常点击?

vue自定义长按指令

为啥识别不了二维码?

python+appium自动化测试-单点和多点触控操作