UITapGestureRecognizer 未在 Swift 3 中触发

Posted

技术标签:

【中文标题】UITapGestureRecognizer 未在 Swift 3 中触发【英文标题】:UITapGestureRecognizer not firing in Swift 3 【发布时间】:2017-02-26 12:25:54 【问题描述】:

我在自定义UIViewController 中有以下代码:

let tapDismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismissTap))

func dismissTap() 

    print("Tap!")


override func viewDidLoad() 
    super.viewDidLoad()

    self.view.addGestureRecognizer(tapDismissTextField)
    self.friendsView.addGestureRecognizer(tapDismissTextField)

没有“点击!”正在打印线条,因此手势识别器没有触发。可能出了什么问题?

User Interaction Enabled 在此控制器中的所有视图中 true

如果有帮助的话,这个视图控制器会嵌入到 UINavigationController 中。

【问题讨论】:

这不是正确的语法,我也不知道你的代码怎么没有抛出错误,因为没有UITapGestureRecogniser,只有UITapGestureRecognizer(用z,而不是@ 987654327@) 抱歉,这些都是带z的 现在,好多了。拼写真的很重要。 有趣,好吧。我只用手势识别器留下了 self.view,但什么都没有打印。问题可能出在这段代码之外吗? 现在发布答案 【参考方案1】:

1.移动这一行:

let tapDismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismissTap))

viewDidLoad() 内部,因为在方法/函数/闭包之外的self 返回一个(NSObject) -> () -> YourClass()(一个NSObject),而不是你的类,它实际上是view 的所有者。

2.我建议只留下一个视图GestureRecognizer

【讨论】:

【参考方案2】:

只有在加载视图后才需要分配 self。

var tapDismissTextField: UITapGestureRecognizer!

在你的 viewDidLoad 方法中:

override func viewDidLoad() 
    super.viewDidLoad()
    tapDismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismissTap))
    view.addGestureRecognizer(tapDismissTextField)

【讨论】:

【参考方案3】:

将 tapDismissTextField 添加到 viewdid 加载中

override func viewDidLoad() 
    super.viewDidLoad()
 let tapDismissTextField = UITapGestureRecognizer(target: self, action: #selector(dismissTap))
    self.view.addGestureRecognizer(tapDismissTextField)
    self.friendsView.addGestureRecognizer(tapDismissTextField)

【讨论】:

【参考方案4】:

这不是在UITextField 上获取操作的正确方法。我猜您确实将 setUserInteraction 更改为 false 以防止 UITextField 行为。对?这就是你的手势识别器不起作用的原因。

因此,您需要付出,因为我们现在处于两难境地。我们希望手势起作用,我们不希望 UITextField 表现正常。我们需要知道您将实现什么才能更好地帮助您。

信息:

如果您不想显示自定义视图。例如UIPickerView 设置 inputView 属性为您的 UITextField 并删除您的手势 识别器。

解决方法:

您可以在UITextField superview 上使用点击手势。并且,尝试 检测水龙头是否在UITextField 的框架内。 example

另一种解决方法:

尝试对 textFieldDidBeginEditting 代表执行您的操作 方法。并进行一些调整以禁用键盘。可能正在设置 inputView 为零。

因此,我们需要准确了解您想要达到的目标,以便为您提供合适的解决方案。

【讨论】:

以上是关于UITapGestureRecognizer 未在 Swift 3 中触发的主要内容,如果未能解决你的问题,请参考以下文章

UITapGestureRecognizer 不适用于 UIView 动画

使用 UITapGestureRecognizer 无法识别的选择器

UIlabel 中的 UITapGestureRecognizer 错误

UITapGestureRecognizer 的问题

带有点击事件的 UITapGestureRecognizer

UIButton 上的 UITapGestureRecognizer