防止键盘在更改视图时关闭

Posted

技术标签:

【中文标题】防止键盘在更改视图时关闭【英文标题】:Prevent keyboard from dismissing while changing views 【发布时间】:2018-01-10 14:13:56 【问题描述】:

在诸如股票消息应用之类的应用上,如果您正在与显示键盘进行对话并滑动以返回您的对话列表,则键盘会在视图被滑动时保持向上。

我似乎不知道如何模仿这种行为,但我在其他应用中看到过,所以它一定是可能的。

编辑:不确定我是否理解为什么这会导致投票失败。这绝对是一个我在谷歌上找不到答案的有效问题?

编辑 2:这是我试图完成的视频 https://arxius.io/v/a555c8db 与不和谐 https://arxius.io/v/0bfda09a 中的这种行为相比

【问题讨论】:

你试过什么?编辑:我显然问了一个“通用”的问题(抱怨的页面),所以我会要求像你的问题需要的那样回答它。你试过什么?你有代码来帮助我们重现这个问题吗?是的,这是一个有效的问题 - 但 方式 太模糊,无法回答。您希望键盘在更改视图时继续显示 - 我认为。那是你的问题吗?如果是这样,您如何更改视图(和控制器?)以及您尝试展示什么新的 VC 和键盘? 这个视频正好展示了我想要达到的目标arxius.io/v/a555c8db 查看我对建议答案的评论。您当然可以理解,评论中的链接视频并不是一个好主意!在这里阅读什么是一个好问题 - 你的(到目前为止)不是:***.com/help/mcve 为了帮助你,我们需要这里的信息来了解你所面临的问题。谢谢。 我将视频添加到问题中。显然我无法用语言解释,所以希望这些视频会有所帮助。 【参考方案1】:

在诸如股票消息应用之类的应用上,如果您正在与显示键盘进行对话并滑动以返回您的对话列表,则键盘会在视图被滑动时保持向上。

我实际上并没有看到这种行为,至少在 iPhone 上的消息应用程序中是这样。也就是说,只要第一响应者可以接受文本,键盘就应该保持可见。如果您想切换到不同的视图控制器并保持键盘可见,请确保新视图图中的第一响应者是可编辑的。例如,如果有一个文本字段,您可以将其设置为第一响应者。

【讨论】:

链接视频并不是向我们寻求帮助的最佳方式——尤其是在对答案的评论中。您能否在您的问题中更具描述性(希望有代码)? 当我的问题是默认行为时,我不确定我是否了解代码的相关性。我的问题是找出我需要添加而不是更改的内容。【参考方案2】:

所以在我们讨论任何类型的解决方案之前,让我们准确了解为什么键盘被关闭。

如您所知,ios UI 在基于视图控制器的系统上工作,文本字段最终由某处的视图控制器管理。

当您单击返回按钮时,活动视图控制器从导航堆栈中释放,因此系统推断该文本字段不再使用,因此将其作为第一响应者。

不幸的是,没有内置方法可以改变这种行为,虽然我们可以推测苹果可能会如何做到这一点,但我们不知道。

我们拥有的几个选项并不是特别整洁,但我过去成功使用的一种方法是在弹出视图控制器并将其设置为第一响应者之前直接在窗口上创建一个隐藏的文本字段。然后在您的另一个视图控制器上,文本字段可以从不可见的视图控制器中获取第一响应者并将其删除。

这并不理想,但这是我想到的唯一技术。

【讨论】:

我不是希望键盘永久保持,我希望它消失,但不是在视图开始消失后立即消失。这是我指的行为arxius.io/v/a555c8db【参考方案3】:

正确的是,您必须为两个视图提供 UITextFiled 才能在它们之间一致地传递键盘。但是没有人说这个文本字段必须在屏幕上,或者必须是 ViewController 视图的一部分。 因此,您所要做的就是将此 textFiled 放在屏幕外的某个位置,例如作为窗口的子视图或 NavigationController 的视图,使其成为第一响应者,然后切换到视图 didAppear 上的文本字段:

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    self.textField.becomeFirstResponder()


override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(animated)
    let fixedView = self.view.window
    let fakeTextField = fixedView?.subviews.last as? UITextField ?? UITextField()
    fakeTextField.autocapitalizationType = textField.autocapitalizationType
    fakeTextField.autocorrectionType = textField.autocorrectionType
    fakeTextField.center = CGPoint(x: -100, y: -100)
    fixedView?.addSubview(fakeTextField)
    fakeTextField.becomeFirstResponder()

确保键盘配置相同,否则会切换。

【讨论】:

感谢您的回复,但如果您查看问题中的视频,这不是我要问的。 视频 arxius.io/v/a555c8db 显示默认行为。并且与问题标题无关。 是的,我该如何做到这一点?对我来说,默认情况下它确实像我问题中的第二个视频。

以上是关于防止键盘在更改视图时关闭的主要内容,如果未能解决你的问题,请参考以下文章

键盘出现时防止对 UICollectionView 进行任何更改

在 Modal 中防止键盘关闭 React Native

React Native 如何防止键盘在文本提交时关闭?

在 iPad 上,如何防止模态视图在键盘呈现时向上移动?

将视图用作 inputAccessoryView 时如何防止键盘添加自己的高度约束

如何防止键盘出现在自定义警报视图上