Así es como he manejado esto antes. En primer lugar crear un método en el controlador de vista que va a ocultar el teclado al renunciar primer estado que responde en su campo de texto:
- (IBAction)dismissKeyboard:(id)sender
{
[mainTextController resignFirstResponder];
}
A continuación, en la escena del guión gráfico para su ViewController
(o nib
, si usted no está utilizando guiones gráficos) cambie la clase de la propiedad view
de su ViewController de UIView
a UIControl
. La propiedad view
es efectivamente el fondo detrás de los otros elementos de la IU. El tipo de clase debe modificarse porque UIView
no puede responder a eventos táctiles, pero UIControl
(que es una subclase directa de UIView
) puede responder a ellos.
Finalmente, en el método viewDidLoad:
de su ViewController, indique a su controlador de vista que ejecute su método dismissKeyboard
cuando la vista recibe un evento UIControlEventTouchDown
.
- (void)viewDidLoad
{
[super viewDidLoad];
UIControl *viewControl = (UIControl*)self.view;
[viewControl addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchDown];
}
EDIT:
Parte de su preocupación parece ser que textFieldDidEndEditing:
se llama cuando se desestimó el teclado. Eso es inevitable, siempre se llamará siempre que un campo de texto pierda el foco (es decir, el estado del primer respondedor). Parece que su problema es que ha puesto el código a realizar cuando el usuario hace clic en el botón de retorno en textFieldDidEndEditing:
. Si no desea que ese código se ejecute cuando el usuario toque fuera del campo de texto, ese no es el lugar apropiado para ponerlo.
En su lugar, me gustaría poner ese código en un método separado:
- (IBAction)textFieldReturn:(id)sender
{
if ([mainTextController isFirstResponder]) {
[mainTextController resignFirstResponder];
// put code to run after return key pressed here...
}
}
}
y luego llamar a ese método a través de Target-Acción cuando el campo de texto envía el evento de control UIControlEventEditingDidEndOnExit
.
[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];
Tenga en cuenta que es diferente a UIControlEventEditingDidEndOnExit
UIControlEventEditingDidEnd
. El primero se ejecuta cuando la edición termina cuando el usuario toca fuera del control, este último se invoca cuando la edición finaliza cuando el usuario presiona la tecla de retorno.
Eventualmente llamaremos a resignFirstResponder, que está llamando al método que se llama después de presionar el botón de retorno (Creo textFieldDidEndEditing) –
Estoy confundido, ¿está diciendo que quiere cerrar el teclado pero tiene su campo de texto? ¿estado? Si es así, eso no es posible. Está en lo correcto, se llamará a textFieldDidEndEditing sin importar qué cuando el teclado se cierre y el campo de texto pierda el foco. En lugar de poner allí su lógica de botón de retorno, investigue utilizando una acción de destino para el evento de control UIControlEventEditingDidEndOnExit. De esta forma, puede distinguir entre que el usuario presione el botón de retorno en el teclado mientras edita el campo de texto frente al usuario que abandona el campo de texto al hacer clic en cualquier otro lugar de la vista. – jonkroll
No te entendí del todo. ¿Puedes editar tu respuesta para mostrar lo que quieres decir? Gracias –