Muchas respuestas interesantes. Me gustaría compilar diferentes enfoques en la solución que pensé que se ajusta mejor a un escenario de UITableView (es el que suelo usar): lo que normalmente queremos es básicamente ocultar el teclado en dos escenarios: al tocar fuera de los elementos de la interfaz de usuario de texto, o al desplazarse hacia abajo o hacia arriba en UITableView. El primer escenario lo podemos agregar fácilmente a través de TapGestureRecognizer, y el segundo a través del método UIScrollViewDelegate scrollViewWillBeginDragging :. Primera orden del día, el método para ocultar el teclado:
/**
* Shortcut for resigning all responders and pull-back the keyboard
*/
-(void)hideKeyboard
{
//this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
[self.tableView endEditing:YES];
}
Este método renuncia a cualquier interfaz de usuario de textField de las subvistas dentro de la jerarquía de vista UITableView, por lo que es más práctico que renunciar a cada elemento de forma independiente.
A continuación, nos encargamos de descartar mediante un gesto Tap externo, con:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setupKeyboardDismissGestures];
}
- (void)setupKeyboardDismissGestures
{
// Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
// UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// swipeUpGestureRecognizer.cancelsTouchesInView = NO;
// swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
// [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//this prevents the gestureRecognizer to override other Taps, such as Cell Selection
tapGestureRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapGestureRecognizer];
}
Establecer tapGestureRecognizer.cancelsTouchesInView en NO es para evitar que el gestoRecognizer anule el funcionamiento interno normal de UITableView (por ejemplo, para no interferir con la selección de celda).
Finalmente, para manejar ocultar el teclado al desplazarse hacia arriba / abajo en UITableView, debemos implementar el método scrollViewWillBeginDragging: del protocolo UIScrollViewDelegate, como:
archivo .h
@interface MyViewController : UIViewController <UIScrollViewDelegate>
archivo .m
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
¡Espero que ayude! =)