代码之家  ›  专栏  ›  技术社区  ›  iWheelBuy

VIEWDID消失后键盘不会消失

  •  2
  • iWheelBuy  · 技术社区  · 8 年前

    iOS 11.2,Xcode 9.2

    我已经尝试了所有方法来解除键盘打开 viewDidDisappear 旧的 UIViewController 之后 一个新的 UIViewController 被推入 UINavigationController 堆栈但是没有运气。

    如果我在 viewWillDisappear -它将被取消,但带有动画 期间 推送动画。这不是我们想要的行为。我想要旧的 UIViewController 只有当控制器不再可见时,才能关闭的键盘。

    行为应类似于Telegram应用程序:

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

    感谢您的帮助!

    P、 这个问题看起来像是重复的,但我没能用我找到的解决方案来解决它。

    编辑1。

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

    为了重现不良行为:

    • 启动应用程序。
    • 轻触 UITextField 或 UITextView 然后等待键盘出现。
    • 点击“Next”(下一步)按钮,等待按下新控制器。
    • 点击“后退”按钮,等待弹出新控制器。

    因此,在按下/弹出操作后,初始视图控制器将具有活动键盘。我需要在按下/弹出操作后隐藏键盘。此外,在初始视图控制器不可见之前,不应解除键盘,应在 视图消失 行动

    2 回复  |  直到 8 年前
        1
  •  2
  •   iWheelBuy    8 年前

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

    使用属性: 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

        2
  •  2
  •   XeNoN    8 年前

    出现此问题的原因是响应程序由 UIKit 之间 viewWillAppear 和 viewDidAppear ,就在视图出现之前 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
    }
    

    这将给你电报同样的效果。