3

我只有 iOS8 才有这个问题。在 iOS7 上一切正常。

我的视图配置:

  • 我有一个 UIView 子类,它有一个自定义 inputView(自定义键盘)
  • UIView 子类有一个点击手势识别器,这使它成为点击时的第一响应者
  • UIView 子类包含一个 UITextView 子视图

我的测试程序:

  1. 点击 UIView 子类。显示自定义键盘。
  2. 在 inputView 上点击一个特殊键,这会使 UITextView 成为第一响应者。显示字母键盘。
  3. 在 UITextView 中输入文本后,再次点击 UIView 子类使其成为第一响应者。字母键盘消失,自定义键盘重新出现。
  4. 单击主页按钮退出到主屏幕。点击应用程序图标以恢复应用程序。

错误是当应用程序恢复时,inputView 不再可见,而它就在第 4 步之前。点击 UIView 子类不会把它带回来。如果我在第 4 步之后检查 UIView 子类,isFirstResponder 将返回 true。

知道如何防止我的 inputView 消失吗?

4

2 回答 2

3

这绝对是一个 iOS 错误。

inputView发布与常规键盘相同的键盘通知。在这种情况下,即使仍然是第一响应者,也会在应用程序前台UIKeyboardWillHideNotification调用 for 。MainViewinputViewMainView

一个更干净的解决方法是注册UIKeyboardWillHideNotificationonMainView并重置 firstResponder 状态。

NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleKeyboardWillHideNotification:", name: UIKeyboardWillHideNotification, object: nil)

处理越野车触发器。

func handleKeyboardWillHideNotification(notification:NSNotification) {
    if (self.isFirstResponder())
    {
        self.resignFirstResponder()
        self.becomeFirstResponder()
    }
}
于 2014-11-13T21:17:00.593 回答
0

我在这里发布了一个示例项目,演示了该错误及其修复:https ://github.com/jeremywhuff/HWInputViewBugExample

在 iOS8 上运行它,你会看到 bug。在iOS7上运行它,你不会。

我添加了一个“hack fix”开关,它将演示修复。绝对不理想,但这是我能想到的最好的。它会导致键盘在模拟器上闪烁,但在设备测试期间,这似乎不会发生。

可以在 applicationDidBecomeActive 中找到 hack 修复:

mainView.textView!.becomeFirstResponder()
NSTimer.scheduledTimerWithTimeInterval(0.05, target: mainView.textView!, selector: "resignFirstResponder", userInfo: nil, repeats: false)

这会导致文本视图成为并迅速退出第一响应者,这似乎将系统从其不可见的 inputView 模式中踢了出来。

于 2014-11-13T18:35:41.440 回答