2009-06-08 15 views
29

Tengo una UIView con varios cuadros de texto. Ahora he usado delegados para cambiar el respondedor de un campo de texto a otro. En este caso, mi teclado desaparecerá cuando el usuario llegue al último campo de texto.Ocultar el teclado cuando el usuario toca uiview

pero ahora quiero ocultar mi teclado cuando el usuario toca UIView (toca cualquier parte de la pantalla, excepto los cuadros de texto). Puede alguien ayudarme con esto.

Gracias

Respuesta

43

Uso resignFirstResponder en touchesBegan, así:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 
    if(touch.phase == UITouchPhaseBegan) { 
     [self.myTextField resignFirstResponder]; 
    } 
} 

Es posible que tenga que llamar a esto en múltiples campos del texto si usted no está seguro donde el foco se encuentra en la actualidad; No he probado ese caso.

Además, en el Interface Builder, tendrá que habilitar la opción "Interacción usuario habilitado" casilla de verificación para la vista, o mediante programación utiliza:

myView.userInteractionEnabled = YES; 
+0

Pero dónde llamar este resignFirstResponder . ¿Cómo saber que el usuario tocó la UIView? – nbojja

+1

He editado la publicación para incluir un ejemplo en touchesBegan. – PCheese

+0

Oye, gracias por tu ayuda ... funcionó bien con UIView. Pero tengo otro escenario donde tengo cuadros de texto en UITableView. en este caso su código no está funcionando.Soy muy nuevo en el desarrollo de iPhone, así que por favor ...... – nbojja

3

Según Beginning iPhone Development, se dibuja un botón rect ronda de manera que cubre toda su UI; la pantalla completa. Luego, vaya al menú Distribución y haga clic en Enviar al fondo. Luego, en el inspector, cambie el tipo de botón de rect recto a personalizado. Ahora agregue un evento de retoque interno a este botón y conéctelo a un método que lo maneje. Dentro del cuerpo de este método, asegúrese de que tiene las declaraciones:

[myTextFieldOne resignFirstResponder]; 
[myTextFieldTwo resignFirstResponder]; 

envían los Básicamente el mensaje resignFirstResponder a cada uno de los campos de texto, o cualquier campo que puede producir un teclado.

En realidad, soy nuevo en el iPhone SDK. No sé si este es el mejor método, pero funciona y es lo que aprendí del libro mencionado anteriormente. Espero eso ayude.

+0

¿Estás seguro de que tu sugerencia se ajusta al patrón MVC? – Malloc

2

Gracias, Blaenk, estaba tratando de averiguar cómo hacer esto y no me di cuenta de que podía poner un botón en el fondo, buen truco. Aquí está mi contribución (nuevo en este sitio y Cocoa Touch por lo que no puede ser el código más robusto nunca, pero que está funcionando hasta ahora ...):

que llamo este método desde el evento touchUpInside en mi UIButton:

-(void)closeKeyboard:(id)sender { 
    UIView *theFirstResponder = [self findFirstResponder]; 
    if (theFirstResponder) { 
     [theFirstResponder resignFirstResponder]; 
    } 
} 

Cuando este bucle encuentra el firstResponder:

- (UIView *)findFirstResponder { 
    UIView *firstResponderView = nil; 
    for (UIView *view in [self entryFields]) { 
     if ([view isFirstResponder]) { 
      firstResponderView = view; 
      break; 
     } 
    } 
    return firstResponderView; 
} 

que depende de cada uno de los UITextField controles en la vista que tiene una etiqueta asignado a ellos (de nuevo, puede hacer tha t en Interface Builder).

Mis dos centavos de todos modos, ¡aunque será mejor que devuelva algo!

14

utilizo

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.phase==UITouchPhaseBegan){ 
     //find first response view 
     for (UIView *view in [self.view subviews]) { 
      if ([view isFirstResponder]) { 
       [view resignFirstResponder]; 
       break; 
      } 
     } 
    } 
} 
+0

Simple, conciso y totalmente genérico. ¡Muy agradable! – ryan0

2

SO Agonicé sobre esto y lo he descubierto ..

no necesita el otro botón ni nada.

Todo lo que necesita hacer es seleccionar "Propietario de archivos", en el inspector arrastre desde su salida de campo de texto (o lo que sea que llame) a su campo de texto real (a través de lo que usted denominó) Esto será además de las entradas ya habías conectado.

y por supuesto, además de la salida de control (UIView cambiado a través de inspector de uicontrol) al propietario archivos a través de backgroundtouched ... lo primero que todos hemos probado

1

Cambiar la clase UIView a uicontrol clase desde la pestaña de identificar inspector. Añadir este :

- (IBAction)tabBackground:(id) sender; 

a su archivo .h.

Añadir esto a su archivo .m:

- (IBAction)tabBackgroup:(id) sender { 
    [nameField resignFirstRespnder]; 
    [numberField resignFirstResponder]; 
} 

Conecte su tabBackground del inspector, la acción de la sección a la UIView (que es un un uicontrol) recibió y ya está bueno para ir.

25

Simplemente llame a esto en su controlador de vista cuando desee ocultar el teclado.

[self.view endEditing:NO];

+1

Gracias hombre! Salvó mi día a lo grande. :) :) –

3

Una manera muy fácil de hacer esto está trabajando en lo que dijo PCheese.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch * touch = [touches anyObject]; 
if(touch.phase == UITouchPhaseBegan) { 
    [self.view endEditing:YES]; 
} 

}

he usado anteriormente [self.view endEditing:YES]; para un evento de botón, pero cuando se combina con la respuesta anterior es que funciona un convite. Mucho más fácil, y no tienes que hacer nada más, solo ponlo en tu archivo .m. Además, esto funciona con todos los campos de texto (al menos, hasta donde he visto) (funciona para UITextField y UITextView).

Sé que OP probablemente todavía no lo necesite, pero solo quiero compartirlo para otros con el mismo problema.

1

La forma más adecuada de resolver este problema es utilizar el siguiente método:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    if(![touch.view isMemberOfClass:[UITextField class]]) { 
     [touch.view endEditing:YES]; 
    } 
} 

Nota: Esto no funciona en casos UIScrollView.

0

para SWIFT 4,0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    if touch?.phase == UITouchPhase.began { 
     touch?.view?.endEditing(true) 
    } 
} 
Cuestiones relacionadas