viewDidDisappear 后键盘不会消失

Keyboard does not disappear after viewDidDisappear

iOS11.2,Xcode9.2

我已经尝试了所有方法来关闭旧 UIViewController viewDidDisappear 上的键盘 AFTER 一个新的 UIViewController 被推入UINavigationController 堆栈。但是没有运气。

如果我在 viewWillDisappear 关闭它 - 它会被关闭,但带有动画 DURING 推送动画。这不是期望的行为。我希望仅当控制器不再可见时才关闭旧 UIViewController 的键盘。

Telegram 应用程序中的行为应该是这样的:

在任何带有可见键盘的对话框中,按下对手的头像,您将被推送到对手的帐户信息。然后,如果您按下后退按钮,您将被重定向回对话框。但是键盘已经被关闭了。

感谢任何帮助!

P.S。这个问题可能看起来像重复的问题,但我未能使其与我找到的解决方案一起使用。

编辑 1.

我创建了一个小的 TEST PROJECT,它表示未能实现所需的行为。

为了重现不良行为:

因此 - 初始视图控制器将在 push/pop 操作后拥有活动键盘。我需要在 push/pop 操作后隐藏键盘。此外,在初始视图控制器变为不可见之前不应关闭键盘,应该在 viewDidDisappear 操作后关闭。

有些情况下没有文本字段是第一响应者但键盘在屏幕上。在这些情况下,上述方法无法关闭键盘。

使用 属性: isEditabletextView。这是经过测试的代码:

  override func viewWillAppear(_ animated: Bool) {
    self.viewTextView.isEditable = false
    super.viewWillAppear(animated)
  }

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.viewTextView.isEditable = true
  }

结果:

来自 @iWheelBuy 的评论:

Sometimes, text views will have inputAccessoryView. The way you do it will make the keyboard disappear, but the inputAccessoryView will remain... That is why you should also make inputAccessoryView = nil or inputAccessoryView = UIView() when setting isEditable = false

问题的发生是因为 UIKitviewWillAppearviewDidAppear 之间、视图出现之前以及 viewWillDisapear:viewWillDisapear: 之间管理(恢复、保存)响应者viewDidDisapear:,就在视图消失之前。这就是为什么在动画期间对响应者所做的任何更改都是可见的。

为了获得您想要的效果,您可以阻止视图在视图再次出现之前成为响应器,而不是删除响应器。

UITextFieldUITextView 执行此操作的最简单方法是在视图出现之前临时禁用交互,然后在视图重新出现后恢复它。

override func viewWillAppear(_ animated: Bool) {
    self.viewTextField.isUserInteractionEnabled = false
    self.viewTextView.isUserInteractionEnabled = false
    super.viewWillAppear(animated)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.viewTextField.isUserInteractionEnabled = true
    self.viewTextView.isUserInteractionEnabled = true
}

这会给你 Telegram 相同的效果。