【问题标题】:InputAccessoryView inside a UIPageViewController doesn't show by defaultUIPageViewController 中的 InputAccessoryView 默认不显示
【发布时间】: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 默认显示?

谢谢!

【问题讨论】:

  • 你发现了吗?

标签: ios swift 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()
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-11
        • 1970-01-01
        • 2019-11-09
        • 2015-07-12
        • 2015-04-28
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多