iOS 当 UITextField 成为 Touch ID 完成块中的第一响应者时,不显示键盘(在 UIRemoteKeyboardWindow 内)(iOS 10)

iOS Keyboard (inside UIRemoteKeyboardWindow) is Not Shown When UITextField Becomes First Responder in Touch ID Completion Block (iOS 10)

我最近在我的应用程序中发现了一个问题,该问题似乎只发生在 iOS10 中,当以编程方式触发文本字段成为完成处理程序内的第一响应者时,系统键盘不显示 - - 特别是我从 Touch ID 尝试中得到的完成处理程序。

这个问题的疯狂部分是,即使没有显示键盘,iPhone 上键盘通常所在的区域仍然响应触摸输入,就好像用户在键盘上打字一样键盘!

在对该问题进行大量调查和调试之后,我偶然发现 hidden 属性 在私有 UIRemoteKeyboardWindow 上设置为 YES在文本字段上调用 ​​becomeFirstResponder 后创建。在我调出键盘的其他情况下, hidden 属性 的值设置为 NO.

有其他人 运行 在 iOS 10 中解决过这个问题吗?如果是这样,有人找到解决方案吗?我尝试在 window 实例上手动将 hidden 值设置为 YES,但这对它没有影响。在这一点上我几乎抓住了救命稻草。

附件:
这是当文本字段成为 Touch ID 完成处理程序之外的第一响应者时 UIApplication 实例的 windows 的输出(密切注意 UIRemoteKeyboardWindow):

UITextField 成为 Touch ID 处理程序中的第一响应者时...

第一次更新

所以我没有考虑 becomeFirstResponder 在一些人指出之前在主线程上完成,但不幸的是,它没有解决问题——但是,我确实有一些额外的发现。 hidden window 问题似乎源于在发出 becomeFirstResponder 操作后立即输出 UIApplication 实例的 windows 的详细信息。这样做之后,我在 UITextField 编辑回调上设置了一个断点并继续与键盘交互(这是不可见的)——当我输出 window 细节时,它看起来不像hidden 属性 曾经设置为 YES(这可能排除 属性 被设置为问题的原因),但我仍然有一个不可见的键盘!我开始调试视图层次结构,下面是我检查键盘时的截图 window:

希望你们能看到我在这里发现的是,钥匙是存在的,但似乎有一些白色的视图挡住了它们。问题是,我什至没有在我的应用程序屏幕上看到那些白色视图。当它出现时,我只看到通常位于键盘后面的东西。

作为临时解决方法,在延迟修复此问题后调用 becomeFirstResponder,但是,对 hacky 解决方案不满意。

看起来这个问题也出现在不同的场景中 - 即使您在取消 touchId 警报后手动选择文本字段,键盘也可能不可见。