2012-06-19 6 views
10

Tengo una jerarquía de vistas que parece queDetectar golpecito en el "espacio vacío" de UIView

UIScrollView 
| 
+- UIView 
    | 
    +- UITextField 
    +- UITextField 
    +- UIButton 

Lo que yo quiero es que el usuario, que golpeó a uno de los campos de texto y ve el teclado en la pantalla para ser capaz de tocar en un "espacio vacío" de UIView para ocultar el teclado. Por lo tanto, no quiero, por ejemplo, que un evento de UIButton suba a UIView (eso es exactamente lo que sucede si agrego UITapGestureRecognizer a UIView).

¿Cómo puedo lograr la funcionalidad deseada?

Respuesta

22

En el método de viewDidLoad añadir este gesto reconocedor:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
gestureRecognizer.cancelsTouchesInView = NO; 
[self.view addGestureRecognizer:gestureRecognizer]; 

continuación, agregue el dismissKeyboard método:

- (void) dismissKeyboard{ 
    [YOURFIELDHERE resignFirstResponder]; 
} 

También es necesario añadir esto a hacerlo de modo que los botones están todavía se puede hacer clic y no anulado por el reconocedor de gestos:

gestureRecognizer.delegate = self; // in viewDidLoad 
<UIGestureRecognizerDelegate> //in your header file 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    if ([touch.view isKindOfClass:[UIButton class]]){ 
    return NO; 
    } 
    return YES; // handle the touch 
} 
+0

El delegado de GestureRecognizer es algo que no he estado usando. En cambio, usé subclases tontas para procesar toques, esto podría haberse hecho mucho más fácil. Gracias. – Eugene

+0

He cometido ese error más de una vez. Reinventé la rueda, y no muy elegantemente, solo para encontrar que había un método de delegado que hacía lo que quería incluso mejor de lo que había logrado. Es una verdadera caída de la documentación de Apple, en mi opinión. –

+0

¡Gran respuesta! ¡Muchas gracias! – HiveHicks

1

Me encuentro con este mismo problema y lo resuelvo con una solución ingenua.

  1. Cambie la Vista de una instancia de UIView a una instancia de UIControl para que pueda manejar eventos táctiles.
  2. Cree un método IBAction en el controlador de vista que maneja el evento táctil. En este caso, renunciaremos a cualquier primer respondedor de las subvistas de la vista.

    - (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }

    contentView es sólo la instancia variable apuntando a la vista. Puedes ponerle el nombre que quieras. Cuando pasó el mensaje endEditing a la Vista, esencialmente le dice a sus subvistas que renuncien al primer respondedor, descartando así el teclado.

  3. Conectar el objetivo (Ver) y la acción (método IBAction que acaba de crear) a través de Interface Builder, abriendo la connection inspector de la vista, seleccione Touch Up Inside y arrastrarlo a objeto propietario del archivo, a continuación, seleccione el nombre del método .

Espero que ayude.

1

sé que es un poco tarde, pero una solución rápida, sencilla es la siguiente:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    [self.view endEditing:YES]; 
} 

a que lo invocan si toca en cualquier espacio vacío.

Cuestiones relacionadas