¿Una forma sencilla de descartar el teclado?

Resuelto Seventoes asked hace 15 años • 31 respuestas

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?

Seventoes avatar Apr 12 '09 09:04 Seventoes
Aceptado

Intentar:

[self.view endEditing:YES];
kirby avatar Sep 14 '2010 01:09 kirby

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.viewen 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).

Nicholas Riley avatar Apr 12 '2009 05:04 Nicholas Riley

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.

Travelling Man avatar Jan 05 '2013 01:01 Travelling Man

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.

  1. 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:)];
    
  2. 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];
    }
    
  3. 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.

Brett Levine avatar Jun 27 '2011 22:06 Brett Levine

Esta es una solución para hacer que el teclado desaparezca cuando se presiona returncualquier 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 viewcontrollercon dos campos de texto (nombre de usuario y contraseña). y el protocolo viewcontrollerde 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 returnel teclado, ¡se descarta!

En su caso, lo mismo funcionaría siempre que establezca todos los delegados del campo de texto en self e implementetextFieldShouldReturn

prakash avatar Jun 24 '2009 08:06 prakash