2012-04-12 15 views
5

Tengo un campo de texto dentro de UIScrollView y quiero mostrar un botón de borrar cuando el usuario comienza a editar. También necesito ocultar el teclado cuando el usuario toca el fondo de UIScrollview (pero no el campo de texto). Mostrar ese botón de borrado no es un problema, el problema es que cuando se toca el botón borrar el teclado se oculta y el campo de texto no se borra. Obviamente, el problema está en el reconocedor de gestos, porque el método que trata de esto se dispara cuando se hace clic en el botón borrar (pero no se activa cuando se toca el campo de texto). Aquí está mi código:El botón claro de UITextfield oculta el teclado cuando está dentro de UIScrollView

//adding gesture recognizer so i can hide keyboard when user taps scrollview 
    - (void) textFieldDidBeginEditing:(UITextField *)textField 
    { 
     if (self.tapOutside == nil) self.tapOutside = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textFieldTouchOutSide:)]; 

     [self.scrollView addGestureRecognizer:self.tapOutside]; 
    } 

    //This hides keyboard BUT IS ALSO CALLED WHEN CLEAR BUTTON IS TAPPED 
    - (void)textFieldTouchOutSide:(id)sender 
    { 
     [self.textfield resignFirstResponder]; 
    } 

    //NEVER GETS CALLED 
    - (BOOL) textFieldShouldClear:(UITextField *)textField { 
     return YES; 
    } 

¿Alguna idea de cómo solucionar esto? ¿Quizás una mejor forma de agregar el reconocedor de gestos? No puedo pensar en una solución elegante ... Muchas gracias de antemano ...

Respuesta

13

que tenían el mismo problema y lo resolvió implementar el método siguiente:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    // Disallow recognition of gestures in unwanted elements 
    if ([touch.view isMemberOfClass:[UIButton class]]) { // The "clear text" icon is a UIButton 
     return NO; 
    } 
    return YES; 
} 

No se olvide de ajustarse con el protocolo "UIGestureRecognizerDelegate" y establecer el delegado (usando sus VARs):

self.tapOutside.delegate = self; 

Saludos

+0

no puedo probarlo hasta la próxima semana, pero parece ser una solución ... ¡muchas gracias! :) –

+0

¿Lo has probado? ¿Funcionó? Si es así, acepta esta respuesta. – Thompsonian

+0

Tuve una subclase UIButton personalizada también en la página, así que hice isKindOfClass: [UIButton class] –

2

estaba teniendo este problema y esta solución funcionó, sin embargo, si yo u tienen otros botones en la vista que permiten que el usuario toque al rellenar el formulario que puede hacer lo siguiente:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
// Disallow recognition of gestures in unwanted elements 
if ([touch.view isMemberOfClass:[UIButton class]] && [touch.view.superview isMemberOfClass:[UITextField class]]) { 

    // The "clear text" icon is a UIButton 
    return NO; 
} 
return YES; 
} 

Esto será reducir el caso con sólo el regreso No se si el botón es una vista secundaria de un UITextField, como en el caso del botón de borrar, pero aún ocultar el teclado si tocan un botón normal que normalmente ejecutaría su código de gesto.

Cuestiones relacionadas