4

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

关闭键盘后让 inputAccessoryView 可见

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

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

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

视图控制器代码

故事板

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

4

2 回答 2

2

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

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

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

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

  2. 或者使用NSLayoutConstraint.

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

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

这个 GitHub 存储库为例。

于 2015-03-10T15:57:32.967 回答
2

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

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

于 2015-03-17T21:50:39.630 回答