我有一个具有UITextField的子视图控制器。我还有一个父视图控制器,我在其中添加了一个子视图控制器。子视图控制器占用父视图控制器的大约一半。
self.childVC = ChildViewController()
self.childVC.delegate = self
func addChildViewController () {
self.addChildViewController(self.childVC)
self.childVC.view.frame = CGRect(x: x, y: y, width: widthOfContainerView, height: heightOfContainerView)
self.view.addSubview(self.childVC.view)
self.childVC.didMove(toParentViewController: self)
}
当用户点击UITextField时,我正在显示键盘,并且我希望每当用户点击文本字段外时键盘都会被解除 - 这要么在子视图控制器的视图中,要么父视图控制器的视图。
现在我在两个子视图控制器和父视图控制器中冗余地设置了一个轻敲手势识别器,以便将其关闭。
func setupTapGestureRecognizer() {
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
view.addGestureRecognizer(tap)
view.isUserInteractionEnabled = true
}
@objc func handleTap(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
作为初学者,我怀疑在我的项目中使用像这样的冗余代码并不是很好的做法,但我无法想出任何其他方法来处理这个问题。
除了用户点击子视图或父视图外,还有哪些其他方法可以确保在文本字段外部点击会关闭键盘?
感谢。
答案 0 :(得分:0)
5年后,这仍然是我必须处理的iOS最讨厌的方面之一。不幸的是,我没有亲自看到处理所有问题的插件方法,但这是我的方法FWIW:
首先,我倾向于使用catch all:而不是弄乱view.endEditing
或手动让第一响应者为各个项目辞职:
UIApplication.shared.sendAction(Selector(resignFirstResponder), to: nil, from: nil, for: nil)
。
这很容易处理一般情况,以及第一个响应者(示例中为TextField
)可能与被点击的视图不在同一个View堆栈中的情况。这也有助于以您喜欢的任何方式添加extension
。
除此之外,它实际上是关于最大化tapGestures
的覆盖范围。以下是我使用的一些选项:
userInteractionEnabled
让水龙头落到下面处理所有东西的层。UIView
,UILabel
等子类,自动处理点击以调用resignFirstResponder
。TextField
时动态添加/删除一组清晰视图。 (不理想,但在某些情况下,我发现这是最简单的解决方案。)希望有人(或Apple)可以为此提出一个更简单的解决方案!