UIPageViewController 中的 InputAccessoryView 默认不显示

Posted

技术标签:

【中文标题】UIPageViewController 中的 InputAccessoryView 默认不显示【英文标题】:InputAccessoryView inside a UIPageViewController doesn't show by default 【发布时间】:2018-07-13 08:09:42 【问题描述】:

我有一个非常典型的类似聊天的屏幕,其中包含一个文本字段的 InputAccessoryView。最初加载屏幕时,键盘是隐藏的,因此文本字段位于屏幕底部。当用户点击文本字段时,键盘会显示并且 InputAccessoryView 会随着键盘向上移动。

此处显示了一个示例:

但是,如果我将相同的 UIViewController 放在 UIPageViewController 中,则默认情况下不会出现 InputAccessoryView。只有在通过点击不同的文本框强制出现键盘时才会出现。

此处示例:

另外,如果切换页面,InputAccessoryView 会再次消失。

设置 InputAccessoryView 的代码如下所示:

class ViewController: UIViewController 

    var chatInputView: ChatInputView?

    override var canBecomeFirstResponder: Bool 
        return true
    

    override var inputAccessoryView: UIView? 
        return self.chatInputView
    

    override func viewDidLoad() 
        super.viewDidLoad()
        let chatInputView = ChatInputView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 124))
        chatInputView.awakeFromNib()
        self.chatInputView = chatInputView
    

InputAccessoryView 是通过 XIB 文件创建的,但非常标准。

所有代码都可以在https://github.com/SuperTango/InputAccessoryView找到

有两个提交。第一次提交被标记为“not_working”,并通过将默认 ViewController 设置为 UIPageViewController 子类来显示不工作的版本。第二次提交标记为“工作”,只是将默认 ViewController 设置为图像中的 ViewController,

在将 UIViewController 放入 UIPageViewController 时,有什么方法可以让 InputAccessoryView 默认显示?

谢谢!

【问题讨论】:

你发现了吗? 【参考方案1】:

为了让inputAccessoryView 出现在您的ViewController 上,您需要将您的ViewController 设置为firstResponder,并且在使用pageViewController 时您有多个ViewControllers,这意味着您需要调用self.becomeFirstResponder() 在你的ViewController 上,只要它出现在屏幕上

您可以在设置chatInputViewviewDidAppear 后调用它

【讨论】:

【参考方案2】:

唯一需要做的就是当你以某种方式选择一个页面并调用setViewControllers([controllers[0].....),之后,你只需要做一个controllers[0].becomeFirstResponder()

就是这样,像魔术一样工作,就像没有页面控制器一样。

【讨论】:

【参考方案3】:

在视图控制器中:

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    DispatchQueue.main.async 
        self.becomeFirstResponder()
    

    
override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(animated)
    resignFirstResponder()

【讨论】:

以上是关于UIPageViewController 中的 InputAccessoryView 默认不显示的主要内容,如果未能解决你的问题,请参考以下文章

uipageviewcontroller 中的 Swift uipageviewcontroller

NavigationController 中的 UIPageViewController

UIPageViewController 中的 UIScrollView 滚动了多少?

如何删除 UIPageViewController 中的 previousViewControllers

UIPageViewController 中的奇怪约束行为

UIPageViewController 中的脊椎到底是啥?