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,它表示未能实现所需的行为。
为了重现不良行为:
- 启动应用程序。
- 点击
UITextField
或 UITextView
并等待键盘出现。
- 点击 "Next" 按钮并等待推送新控制器。
- 点击 "Back" 按钮并等待弹出新控制器。
因此 - 初始视图控制器将在 push/pop 操作后拥有活动键盘。我需要在 push/pop 操作后隐藏键盘。此外,在初始视图控制器变为不可见之前不应关闭键盘,应该在 viewDidDisappear
操作后关闭。
有些情况下没有文本字段是第一响应者但键盘在屏幕上。在这些情况下,上述方法无法关闭键盘。
使用 属性: isEditable
的 textView
。这是经过测试的代码:
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
问题的发生是因为 UIKit
在 viewWillAppear
和 viewDidAppear
之间、视图出现之前以及 viewWillDisapear:
和 viewWillDisapear:
之间管理(恢复、保存)响应者viewDidDisapear:
,就在视图消失之前。这就是为什么在动画期间对响应者所做的任何更改都是可见的。
为了获得您想要的效果,您可以阻止视图在视图再次出现之前成为响应器,而不是删除响应器。
对 UITextField
和 UITextView
执行此操作的最简单方法是在视图出现之前临时禁用交互,然后在视图重新出现后恢复它。
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 相同的效果。
iOS11.2,Xcode9.2
我已经尝试了所有方法来关闭旧 UIViewController
viewDidDisappear
上的键盘 AFTER 一个新的 UIViewController
被推入UINavigationController
堆栈。但是没有运气。
如果我在 viewWillDisappear
关闭它 - 它会被关闭,但带有动画 DURING 推送动画。这不是期望的行为。我希望仅当控制器不再可见时才关闭旧 UIViewController
的键盘。
Telegram 应用程序中的行为应该是这样的:
在任何带有可见键盘的对话框中,按下对手的头像,您将被推送到对手的帐户信息。然后,如果您按下后退按钮,您将被重定向回对话框。但是键盘已经被关闭了。
感谢任何帮助!
P.S。这个问题可能看起来像重复的问题,但我未能使其与我找到的解决方案一起使用。
编辑 1.
我创建了一个小的 TEST PROJECT,它表示未能实现所需的行为。
为了重现不良行为:
- 启动应用程序。
- 点击
UITextField
或UITextView
并等待键盘出现。 - 点击 "Next" 按钮并等待推送新控制器。
- 点击 "Back" 按钮并等待弹出新控制器。
因此 - 初始视图控制器将在 push/pop 操作后拥有活动键盘。我需要在 push/pop 操作后隐藏键盘。此外,在初始视图控制器变为不可见之前不应关闭键盘,应该在 viewDidDisappear
操作后关闭。
有些情况下没有文本字段是第一响应者但键盘在屏幕上。在这些情况下,上述方法无法关闭键盘。
使用 属性: isEditable
的 textView
。这是经过测试的代码:
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 theinputAccessoryView
will remain... That is why you should also makeinputAccessoryView = nil
orinputAccessoryView = UIView()
when settingisEditable = false
问题的发生是因为 UIKit
在 viewWillAppear
和 viewDidAppear
之间、视图出现之前以及 viewWillDisapear:
和 viewWillDisapear:
之间管理(恢复、保存)响应者viewDidDisapear:
,就在视图消失之前。这就是为什么在动画期间对响应者所做的任何更改都是可见的。
为了获得您想要的效果,您可以阻止视图在视图再次出现之前成为响应器,而不是删除响应器。
对 UITextField
和 UITextView
执行此操作的最简单方法是在视图出现之前临时禁用交互,然后在视图重新出现后恢复它。
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 相同的效果。