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

时间:2015-09-18 04:09:28

标签: ios keyboard uitextfield nsnotification

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

有人有什么想法吗?

2 个答案:

答案 0 :(得分:2)

当您输入textField时,它将成为第一响应者,然后键盘将显示在您的视图中。您可以在viewWillAppear方法[textField isFirstResponder]中检查键盘的状态。如果返回YES,表示键盘可见。

-(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     if([textField isFirstResponder]){
       //visible keyboard
     }
}

<强>被修改 如果你想要高度,你可以将键盘高度存储在某个类变量中,当它第一次出现并在viewWillAppear方法中使用时

@implementation YourClass{
    CGFloat keyboardSize;
}

-(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     if([textField isFirstResponder]){
        //user keyboardSize here
     }
}

答案 1 :(得分:1)

我在调试视图层次结构时注意到,当键盘出现时,层次结构中有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
        }
    }
}

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

if UIApplication.shared.isKeyboardPresented {
   print("Keyboard is presented")
}

虽然此方法尚未经过全面测试,但UIRemoteKeyboardWindow位于私有标头中,因此需要NSClassFromString进行检查。关注使用它!