如何在 UITableViewController 中隐藏键盘?

How to hide keyboard in UITableViewController?

我正在构建一个包含 UITableViewController 的应用程序。在 VC 中,我放置了一些用于接受用户输入的文本字段。我使用 table 视图控制器,因为在出​​现键盘时更容易向上移动视图。有关详细信息,请参阅

当我通过观看 thenewboston 的视频学习如何在用户点击其他地方时隐藏键盘时,有人告诉我使用

view.endEditing(true)

touchesBegan 方法中。

我还了解了如何使用滑动手势识别器,以便在用户向下滑动时隐藏键盘。

但是,所有这些都带有普通的视图控制器。当我使用 table 视图控制器执行此操作时,没有任何效果! touchesBeganUISwipeGestureRecognizer 都无效!当我向下滑动或点击某处时,键盘就停留在那里!

为什么会发生这种情况,如何在 table 视图控制器中隐藏键盘?

编辑:

相关代码均在UITableViewController的子类中:

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    view.endEditing(true)
}


@IBAction func swipedDown(sender: UISwipeGestureRecognizer) { // This is connected to a swipe gesture recogniser
    view.endEditing(true)
}

我想你通常就是这样做的,对吧?我在一个普通的视图控制器中试过这个并且它有效。它只是在 table 视图控制器中不起作用。

您应该向 tableView 添加手势识别器。

let dismissTap = UITapGestureRecognizer(target: self, action: "dismissKeyboard:")
dismissTap.numberOfTapsRequired = 1
view.addGestureRecognizer(dismissTap)

然后在您的 dismissKeyboard 选择器中:

func dismissKeyboard(recognizer: UITapGestureRecognizer) {
     view.endEditing(true)
}

默认情况下,UITableView 会处理所有无法覆盖的手势,除非您在 tableView 顶部添加手势或处理 scrollViewWillBeginDragging: 委托。

通过使用scrollViewWillBeginDragging:您可以隐藏键盘。它只会在用户滚动时被调用。触摸和 UIGestures 将不起作用。

如果你想覆盖 -touchesBegan:withEvent: 对于你的 UITableView,你需要子类化 UITableView。

touchesBegan:withEvent:只发送给UIView的子类。您正在实施 touchesBegan:withEvent:在您的 controller.So 中,它不会工作...

你可以像这样用 UIGestureRecognizer 解决这个问题 -

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
self.view.addGestureRecognizer(tap)

然后实现处理程序-

func handleTap(sender: UITapGestureRecognizer? = nil) {
// handling code
 self.view.endEditing(true)
}

现在在相关位置调用 handleTap()。

您可以在 UITableViewController

viewDidLoad() 功能上添加 tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
}