viewDidDisappear

时间:2017-12-16 16:50:27

标签: ios uiview uiviewcontroller first-responder uiresponder

iOS 11.2,Xcode 9.2

我已经尝试了解除旧版viewDidDisappear UIViewController上的键盘的所有方法 将新UIViewController推入{{1}堆栈。但没有运气。

如果我在UINavigationController关闭它 - 它将被解雇,但动画 DURING 推动动画。这不是理想的行为。我希望只有当控制器不再可见时才能解除旧的viewWillDisappear键盘。

行为应该与电报应用程序类似:

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

感谢任何帮助!

P.S。问题可能看起来像是重复的,但我没有使用我找到的解决方案。

修改1。

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

为了重现不良行为:

  • 启动应用。
  • 点按UIViewControllerUITextField,然后等待键盘出现。
  • 点击"下一步"按钮并等待推送新控制器。
  • 点击"返回"按钮并等待弹出一个新控制器。

结果 - 初始视图控制器将在推/弹动作之后具有活动键盘。我需要在推/弹动作后隐藏键盘。此外,在初始视图控制器变为不可见之前不应关闭键盘,应在UITextView操作后将其解除。

2 个答案:

答案 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
  }

<强>结果

enter image description here

来自 @iWheelBuy的评论

  

有时,文字观看次数为inputAccessoryView。你这样做的方式   会使键盘消失,但inputAccessoryView会   保持...这就是为什么你也应该inputAccessoryView = nil   设置inputAccessoryView = UIView()

时设置为isEditable = false

答案 1 :(得分:1)

问题发生的原因是,UIKitviewWillAppear之间的viewDidAppear在视图出现之前以及viewWillDisapear:和{{之间viewDidDisapear:之间管理(还原,保存)了响应者1}},就在视图消失之前。这就是为什么在动画期间对响应者所做的任何更改都是可见的。

您可以在视图再次显示之前阻止视图成为响应者,而不是删除响应者,以获得所需的效果。

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相同的效果。