【问题标题】:Keyboard does not disappear after viewDidDisappearviewDidDisappear 后键盘不消失
【发布时间】:2018-05-30 14:00:15
【问题描述】:

iOS 11.2、Xcode 9.2

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

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

行为应该类似于 Telegram 应用中的行为:

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

感谢任何帮助!

附:该问题可能看起来像是重复的,但我未能使其与我找到的解决方案一起使用。

编辑 1.

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

为了重现不良行为:

  • 启动应用程序。
  • 点击UITextFieldUITextView 并等待键盘出现。
  • 点击“下一步”按钮并等待新控制器被按下。
  • 点击“返回”按钮并等待弹出新控制器。

因此 - 初始视图控制器将在推送/弹出操作后拥有活动键盘。我需要在按下/弹出操作后隐藏键盘。此外,在初始视图控制器不可见之前不应关闭键盘,应在viewDidDisappear 操作后关闭。

【问题讨论】:

    标签: ios uiview uiviewcontroller first-responder uiresponder


    【解决方案1】:

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

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

    有时,文本视图会有inputAccessoryView。你这样做的方式 将使键盘消失,但inputAccessoryView 将 保持......这就是为什么你也应该让inputAccessoryView = nilinputAccessoryView = UIView() 时设置isEditable = false

    【讨论】:

    • 确实,我下载了你的项目,但它不起作用。请检查适用于您的项目的我更新的答案。
    • 您的回答中还应该提到一件小事。有时,文本视图会有 inputAccessoryView。你这样做的方式会使键盘消失,但 inputAccessoryView 会保留......这就是为什么你在设置 isEditable = false 时也应该让 inputAccessoryView = nil 或 inputAccessoryView = UIView()
    【解决方案2】:

    出现问题是因为响应者由viewWillAppearviewDidAppear 之间的UIKit 管理(恢复、保存),就在视图出现之前,以及在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 相同的效果。

    【讨论】:

    • 这个技巧适用于 UITextField,但不适用于 UITextView...而且我的项目中只有 UITextViews...):
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多