Add a category to UIResponder
:
Get 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
Import the category and do below in your action to hide keyboard:
if([[UIResponder currentFirstResponder] respondsToSelector:@selector(endEditing:)]) {
[[UIResponder currentFirstResponder] endEditing:YES];
}
By this solution, you do not need to know the view currently viewing. Just get the current first responder and call endEdition:
. For when editable view become editing, it will become first responder.
EDIT:
With Vyachaslav Gerchicov's suggestion, I add hideKeyboard
method in the category. And just call [UIResponder hideKeyboard];
.