在任何视图中隐藏 iOS 中的键盘?

Hide keyboard in iOS for any view?

有类似的问题,但都是关于知道哪个视图正在编辑的情况。

在我的例子中,我有一个本地通知,我想在应用程序激活时隐藏键盘。

与此同时,我有一个涉及 MMDrawerController 和模态视图的复杂导航。所以我不能只使用最顶层的视图控制器并迭代它的子视图。

如果我不知道当前正在查看的视图,您能解释一下如何隐藏键盘吗?

只需遍历您想为其隐藏键盘的视图并检查 view.isFirstResponder 如果它为真,然后只需执行 view.resignFirstResponder.

将类别添加到 UIResponderGet the current first responder without using a private API

static __weak id currentFirstResponder;

@implementation UIResponder (FirstResponder)

+(id)currentFirstResponder {
    currentFirstResponder = nil;
    [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];
    return currentFirstResponder;
}

-(void)findFirstResponder:(id)sender {
    currentFirstResponder = self;
}

+(void)hideKeyboard {
    id firstResponder = [UIResponder currentFirstResponder];
    if([firstResponder respondsToSelector:@selector(endEditing:)]) {
        [firstResponder endEditing:YES];
    }
}

@end

导入类别并在隐藏键盘的操作中执行以下操作:

if([[UIResponder currentFirstResponder] respondsToSelector:@selector(endEditing:)]) {
    [[UIResponder currentFirstResponder] endEditing:YES];
} 

通过这种解决方案,您不需要知道当前正在查看的视图。只需获取当前的第一响应者并调用 endEdition:。因为当可编辑视图变为编辑视图时,它将成为第一响应者。

编辑:

根据 Vyachaslav Gerchicov 的建议,我在类别中添加了 hideKeyboard 方法。只需调用 [UIResponder hideKeyboard];.

您需要获取 DrawerViewController 的中心面板并从 didReceiveRemoteNotification 方法中添加以下代码。

[drawerController.centerViewController.view resignFirstResponder];