¿Una forma sencilla de descartar el teclado?
Tengo bastantes controles repartidos en muchas celdas de mi tabla y me preguntaba si hay una manera más fácil de descartar el teclado sin tener que recorrer todos mis controles y renunciar a todos como el primer respondedor. Supongo que la pregunta es... ¿Cómo puedo hacer que el actual socorrista acceda al teclado?
Intentar:
[self.view endEditing:YES];
Puede forzar que la vista que se está editando actualmente abandone su estado de primer respondedor con [view endEditing:YES]
. Esto oculta el teclado.
A diferencia de -[UIResponder resignFirstResponder]
, -[UIView endEditing:]
buscará en subvistas para encontrar al socorrista actual. Así que puedes enviarlo a tu vista de nivel superior (por ejemplo, self.view
en un archivo UIViewController
) y hará lo correcto.
(Esta respuesta incluía anteriormente un par de otras soluciones, que también funcionaron pero fueron más complicadas de lo necesario. Las eliminé para evitar confusiones).
Puede enviar una acción dirigida nula a la aplicación; renunciará al primer respondedor en cualquier momento sin tener que preocuparse por qué vista tiene actualmente el estado de primer respondedor.
C objetivo:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Rápido 3.0:
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Las acciones nulas dirigidas son comunes en Mac OS X para los comandos de menú, y aquí hay un uso para ellas en iOS.
Para ser honesto, no me entusiasma ninguna de las soluciones propuestas aquí. Encontré una buena manera de usar TapGestureRecognizer que creo que llega al meollo de tu problema: cuando haces clic en cualquier cosa que no sea el teclado, descarta el teclado.
En viewDidLoad, regístrese para recibir notificaciones de teclado y cree un UITapGestureRecognizer:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; [nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
Agregue el teclado para mostrar/ocultar respondedores. Allí agrega y elimina TapGestureRecognizer a UIView que debería descartar el teclado cuando se toca. Nota: No es necesario agregarlo a todas las subvistas o controles.
-(void) keyboardWillShow:(NSNotification *) note { [self.view addGestureRecognizer:tapRecognizer]; } -(void) keyboardWillHide:(NSNotification *) note { [self.view removeGestureRecognizer:tapRecognizer]; }
TapGestureRecognizer llamará a su función cuando reciba un toque y podrá descartar el teclado de esta manera:
-(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer { [textField resignFirstResponder]; }
Lo bueno de esta solución es que solo filtra por toques, no por deslizamientos. Entonces, si tiene contenido que se desplaza sobre el teclado, los deslizamientos aún se desplazarán y dejarán el teclado mostrado. Al eliminar el reconocedor de gestos después de que desaparezca el teclado, los futuros toques en su vista se manejarán normalmente.
Esta es una solución para hacer que el teclado desaparezca cuando se presiona return
cualquier campo de texto, agregando código en un solo lugar (para no tener que agregar un controlador para cada campo de texto):
considere este escenario:
Tengo un viewcontroller
con dos campos de texto (nombre de usuario y contraseña). y el protocolo viewcontroller
de implementosUITextFieldDelegate
Hago esto en viewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
username.delegate = self;
password.delegate = self;
}
y el controlador de vista implementa el método opcional como
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
e independientemente del campo de texto en el que se encuentre, tan pronto como presiono return
el teclado, ¡se descarta!
En su caso, lo mismo funcionaría siempre que establezca todos los delegados del campo de texto en self e implementetextFieldShouldReturn