UITapGestureRecognizer在Swift 3中没有开火

我在自定义的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) } 

没有“点击!” 线正在打印,所以手势识别器没有开火。 有什么可能出错?

在此控制器中的所有视图中,用户交互已启用。

这个视图控制器embedded在UINavigationController如果有任何帮助的话。

只有在加载视图后才需要指定自己。

 var tapDismissTextField: UITapGestureRecognizer! 

并在你的viewDidLoad方法中:

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

1.移动这一行:

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

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

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

将tapDismissTextField添加到viewdid加载

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

这不是在UITextField上执行操作的正确方法。 我想你没有改变setUserInteractionfalse以防止UITextField行为。 对? 这就是为什么你的手势识别器不起作用。

所以,你需要按照你所看到的,现在我们处于一个两难的境地。 我们希望手势工作,我们不希望UITextField行为正常。 我们需要知道你所做的更好的帮助你。

信息:

如果你想显示自定义视图。 例如UIPickerView设置你的UITextFieldinputView属性,并删除你的手势识别器。

解决方法:

您可以在UITextField超级视图上使用轻击手势。 并且,尝试检测水龙头是否在UITextField的框架内。 例

另一个解决方法:

尝试对textFieldDidBeginEditting委托方法执行操作。 并做一些调整来禁用键盘。 可能是将inputView设置为零。

所以,我们需要确切地知道你想要达到什么样的目的,才能给你正确的解决scheme。