有类似的问题,但它们都是关于他们知道哪个视图正在编辑的情况。
就我而言,我有一个本地通知,我想在应用程序激活时隐藏键盘。
同时,我有一个复杂的导航,其中涉及MMDrawerController
和模式视图。所以我不能只使用最顶层的视图控制器并迭代它的子视图。
如果我不知道当前查看的视图,您能解释一下如何隐藏键盘吗?
有类似的问题,但它们都是关于他们知道哪个视图正在编辑的情况。
就我而言,我有一个本地通知,我想在应用程序激活时隐藏键盘。
同时,我有一个复杂的导航,其中涉及MMDrawerController
和模式视图。所以我不能只使用最顶层的视图控制器并迭代它的子视图。
如果我不知道当前查看的视图,您能解释一下如何隐藏键盘吗?
将类别添加到UIResponder
:
在不使用私有 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];
。
只需遍历您想要隐藏键盘的视图并检查view.isFirstResponder
其是否为真然后简单地执行view.resignFirstResponder
。
您需要获取 DrawerViewController 的中心面板并从 didReceiveRemoteNotification 方法添加以下代码。
[drawerController.centerViewController.view resignFirstResponder];