如果我从另一个已经显示键盘的视图控制器转换过来,如何检测当前是否显示键盘?

Vad*_*off 3 keyboard uitextfield nsnotification ios

我有一个视图控制器,可以在 ViewWillAppear 上创建 UITextField firstResponder。通常我可以依靠 UIKeyboardWillShow 通知来检测键盘是否已显示,但如果我在键盘已经显示时进入当前视图控制器,则不会触发。

谁有想法?

Naj*_*mić 7

我在调试视图层次结构时注意到,当键盘出现时,存在UIRemoteKeyboardWindow层次结构。

首先,我们可以向 UIApplication 添加扩展以检查窗口层次结构UIRemoteKeyboardWindow

extension UIApplication {
    var isKeyboardPresented: Bool {
        if let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow"), self.windows.contains(where: { $0.isKind(of: keyboardWindowClass) }) {
            return true
        } else {
            return false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在viewDidLoad,或需要的地方我们可以检查:

if UIApplication.shared.isKeyboardPresented {
   print("Keyboard is presented")
}
Run Code Online (Sandbox Code Playgroud)

尽管此方法未经过全面测试并且UIRemoteKeyboardWindow位于私有标头中,但这NSClassFromString就是需要检查的原因。放心使用!