iOS 11.2,Xcode 9.2
我已经尝试了解除旧版viewDidDisappear
的UIViewController
上的键盘的所有方法 将新UIViewController
推入{{1}堆栈。但没有运气。
如果我在UINavigationController
关闭它 - 它将被解雇,但动画 DURING 推动动画。这不是理想的行为。我希望只有当控制器不再可见时才能解除旧的viewWillDisappear
键盘。
行为应该与电报应用程序类似:
在任何带有可见键盘的对话框中按下对手头像,您将被推送到对手的账户信息。然后,如果按后退按钮,您将被重定向回对话框。但是键盘已经被解雇了。
感谢任何帮助!
P.S。问题可能看起来像是重复的,但我没有使用我找到的解决方案。
修改1。
我创建了一个小的TEST PROJECT,表示无法实现所需的行为。
为了重现不良行为:
UIViewController
或UITextField
,然后等待键盘出现。结果 - 初始视图控制器将在推/弹动作之后具有活动键盘。我需要在推/弹动作后隐藏键盘。此外,在初始视图控制器变为不可见之前不应关闭键盘,应在UITextView
操作后将其解除。
答案 0 :(得分:1)
有些情况下没有文字字段是第一响应者,但键盘在屏幕上。在这些情况下,上述方法无法解除键盘。
使用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的评论:
有时,文字观看次数为
时设置为inputAccessoryView
。你这样做的方式 会使键盘消失,但inputAccessoryView
会 保持...这就是为什么你也应该inputAccessoryView = nil
设置inputAccessoryView = UIView()
isEditable = false
答案 1 :(得分:1)
问题发生的原因是,UIKit
和viewWillAppear
之间的viewDidAppear
在视图出现之前以及viewWillDisapear:
和{{之间viewDidDisapear:
之间管理(还原,保存)了响应者1}},就在视图消失之前。这就是为什么在动画期间对响应者所做的任何更改都是可见的。
您可以在视图再次显示之前阻止视图成为响应者,而不是删除响应者,以获得所需的效果。
对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相同的效果。