【问题标题】:Leaving inputAccessoryView visible after keyboard is dismissed iOS8?关闭键盘后让inputAccessoryView可见iOS8?
【发布时间】:2015-04-14 07:21:34
【问题描述】:

我想制作像消息传递应用程序这样的行为。我一直在浏览 Stack Overflow 寻找解决方案,确实有很多:

Leaving inputAccessoryView visible after keyboard is dismissed

这是我找到的。但似乎iOS8 的情况有些不同。如果我在新的iOS8 sdk 中做同样的事情,我会得到错误:

'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x7fdcb3441b10> should have parent view controller:<ViewController: 0x7fdcb3b1e9f0> but requested parent is:<UIInputWindowController: 0x7fdcb684c000>'

为了进行更多测试,我制作了一个示例项目,只有一个底部有视图的控制器:

插座连接到底视图,上面只有UITextField。我错过了什么,我如何获得所需的行为?

【问题讨论】:

  • 你试过在代码中初始化UIView,并对其进行强引用吗?
  • 是的,结果是一样的
  • 很奇怪。好的,最后一个问题——你使用的是哪个 Xcode 版本?包括内部版本号和所有内容?
  • 你试过我的答案了吗?如果有效,请接受它作为正确答案。

标签: ios8 uikeyboard inputaccessoryview


【解决方案1】:

您将someView 添加到多个超级视图中,这会导致层次结构不一致(它告诉您)。

当键盘被激活时,它会调用inputAccessoryView() 方法来查看是否需要在键盘上粘贴任何东西,并将其添加到自己的superView 中。但是您已经通过情节提要将其添加到视图中。

现在有两种方法可以解决这个问题:

  1. 用你的视图创建一个.xib 并在你的inputAccessoryView() 中返回那个,而不是你自己将它添加到任何超级视图(键盘会。

  2. 或者使用NSLayoutConstraint完全在代码中实现。

您可以将以下代码添加到您的 ViewController 中,即使键盘被隐藏,视图也会保持不变。

override func canBecomeFirstResponder() -> Bool {
    return true
}

this GitHub repo 为例。

【讨论】:

    【解决方案2】:

    iOS8 与 inputAccessoryView 有一个保留周期。这是一个好帖子,似乎有一个很好的解决方法:

    http://derpturkey.com/uitextfield-docked-like-ios-messenger/

    【讨论】:

    • 使用该变通方法的一个大问题是,在视图而不是视图控制器上实现 inputAccessoryView 时,附件视图的动画在将视图控制器推送到导航堆栈。辅助视图不是使用视图控制器的视图进行动画处理并随其滑动,而是从底部向上动画,而视图控制器视图从右侧滑入。
    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2018-06-11
    • 2017-11-17
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多