UITapGestureRecognizer 不能(总是)为不同于 UIViewController 的目标工作

Posted

技术标签:

【中文标题】UITapGestureRecognizer 不能(总是)为不同于 UIViewController 的目标工作【英文标题】:UITapGestureRecognizer not (always) working for targets that are different than UIViewController 【发布时间】:2016-02-15 21:32:50 【问题描述】:

我有一个自定义的 ios 控制器类,它以编程方式将 UIButton 添加到给定的 UIView。该按钮有一个与之关联的UITapGestureRecognizer,但它仅在自定义控制器是嵌入视图和按钮的UIViewController@property 时才有效。

参见https://github.com/vasile/ios-gesture-recognizer/ 2 个按钮示例,第一个不记录点击手势。

谁能解释一下原因?

【问题讨论】:

【参考方案1】:

这都是关于对象生命周期的。为了在点击按钮时成为按钮的目标,目标对象必须在点击按钮时存在

第一个按钮不是这样(什么都不会发生),因为目标只是一个立即不存在的局部变量。另一方面,其他目标对象是持久的。例如,视图控制器实例的属性与视图控制器一样长。并且视图控制器通常寿命很长;特别是,如果使用得当,如果按钮是视图控制器自己的视图的子视图,它的寿命与按钮一样长!

【讨论】:

感谢matt,“目标对象必须存在”是有道理的,Apple应该将其添加到官方文档中,因为目标定义An object that is the recipient of action messages sent by the receiver when it recognizes a gesture太模糊了。 我不认为 Apple 会因为没有明确提及不存在的对象不能做任何工作而受到指责。这很明显。正如我所说,这实际上与对象生命周期有关。这就是您似乎不理解的难题(即提示您问题的事情)。但是,如果您要进行面向对象的编程,了解对象的生命周期是关键!您的问题表明了它的重要性。

以上是关于UITapGestureRecognizer 不能(总是)为不同于 UIViewController 的目标工作的主要内容,如果未能解决你的问题,请参考以下文章

UITapGestureRecognizer 不能(总是)为不同于 UIViewController 的目标工作

我可以将 UITapGestureRecognizer 添加到我的控制器 self.view,但不能添加到任何自定义视图。为啥?

为什么UITapGestureRecognizer不能在keyWindow(全屏)的子视图中工作?

获取 UITapGestureRecognizer 目标

有没有办法通过 UITapGestureRecognizer 发送对象?

如何为uiview的不同部分添加多个UITapGestureRecognizer?