2012-08-12 15 views
6

Estoy tratando de deshacerse del teclado cuando el usuario toque fuera de mi UITextField, mediante el uso de este método:resignFirstResponder entendimiento con UITextField

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [mainTextController resignFirstResponder]; 
    [super touchesBegan:touches withEvent:event]; 
} 

Sin embargo, esto parece que llamar a un método que se llama después de pulsar el botón de retorno en el teclado, pero solo quiero que el teclado se desvanezca, no presionar return por mí. ¿Cómo puedo lograr eso?

Gracias!

EDITAR: la respuesta de tGilani es la manera más directa, funciona como un encanto, sin cambiar a UIControl. Pero supongo que la respuesta de jonkroll también funciona.

Respuesta

13

tratar

[self.view endEditing:YES]; 

Actualización:

tomar un valor booleano y la pusieron en false en el método init. En el método de método textFieldShouldReturn delegado, ejecutar el código si es falso, de lo contrario omita

- (BOOL) textFieldShouldReturn:(UITextField*)textField 
{ 
    if (!boolean) 
    { 
     // YOur code logic here 
    } 
    boolean = false; 
} 

en su método en el que se llama al método endEditing, establecer booleano true.

boolean = YES;  
[self.view endEditing:YES]; 
8

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 UIControlEventEditingDidEndOnExitUIControlEventEditingDidEnd. 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.

+0

Eventualmente llamaremos a resignFirstResponder, que está llamando al método que se llama después de presionar el botón de retorno (Creo textFieldDidEndEditing) –

+0

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

+0

No te entendí del todo. ¿Puedes editar tu respuesta para mostrar lo que quieres decir? Gracias –

0

necesita cambiar su ViewController's vista de la propiedad de UIView a UIControl utilizando el Inspector de Identidad:

A partir de ahí, sólo tiene que crear un IBAction y decirle al campo de texto para despedir (que estoy asumiendo que es su mainTextController). Si mainTextController no es el campo de texto que desea que el teclado descarte, entonces cambie el método resignFirstReaponder a su campo de texto como tal.

- (IBAction)backgroundTap:(id)sender { 
[myTextField resignFirstResponder]; 
} 

luego desde allí volver a entrar en el archivo Vista de Contoller .xib y conecte la acción para el control de vista y seleccione "Touch Down".