iphone objective-c cocoa-touch ios uitextfield

iphone - uitextfielddelegate



¿Cómo puedo descartar el teclado si un usuario toca el teclado en pantalla? (8)

Quiero poder descartar el teclado del iPhone cuando el usuario toca en cualquier lugar fuera del teclado. ¿Cómo puedo hacer esto? Sé que necesito descartar al respondedor, pero necesito saber cómo implementarlo cuando un usuario toca el espacio del teclado.


Agregue un reconocedor de tapGesture pero asegúrese de que cancelsTouchesInView = NO

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


Debe agregar un UIVIew transparente como una subvista debajo del teclado y manejar los toques allí, para descartar el teclado. El código de abajo es para su referencia.

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(overlayTouched:)]; gesture.delegate = self; [(UITapGestureRecognizer *)gesture setNumberOfTouchesRequired:1]; UIView* trans = [[UIView alloc] initWithFrame:[[delegate view] bounds]]; [trans setOpaque:NO]; [trans setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin]; [trans setAlpha:0.3]; [trans setUserInteractionEnabled:YES]; trans.multipleTouchEnabled = YES; [trans addGestureRecognizer:gesture]; [trans setBackgroundColor:[UIColor blackColor]]; [trans setTag:BLACK_SCREEN_VIEW];


Deberá agregar un UITapGestureRecogniser y asignarlo a la vista, y luego llamar a resignar al primer respondedor en el campo de texto en su selector.

El código:

En viewDidLoad

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

En el despido de la pizarra:

-(void)dismissKeyboard { [self.view endEditing:true]; }


Esta es una solución Swift 4:

let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) self.view.addGestureRecognizer(tap)

Y el despide

@objc func dismissKeyboard() { self.view.endEditing(true) }


La solución más simple que he usado es esta:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [[self view] endEditing:TRUE]; }

El comando endEditing se puede usar en cualquier vista que contenga su campo de texto como una subvista. La otra ventaja de este método es que no necesita saber qué campo de texto activó el teclado. Entonces, incluso si tiene varios campos de texto, simplemente agregue esta línea a la vista de supervisión.

Basado en la documentación de Apple, creo que este método existe específicamente para resolver este problema.


Otra forma de hacerlo es simple:

UIView as UIControl in custom class in the interface builder tu UIView as UIControl in custom class in the interface builder , luego puedes adjuntar un método IBAction en Touch up inside event de UIView : UIControl Touch up inside event de tu UIView : UIControl , luego pones [yourTextField resignFirstResponder] dentro del IBAction method , como esto:

- (IBAction) hideKeyboard: (id) sender { // If you have more than one textfield to dismiss, of course only can be active 1, but here you can''t know who is it, because sender will be the UIView : UIControl [alias resignFirstResponder]; [password resignFirstResponder]; }

Luego, tiene otra opción y es poner en su campo de texto the return key of the keyboard as Done (puede ser cualquiera de los que desee, pero Hecho es bueno para esto, porque el retorno significa hacer una acción con el formulario) en el generador de interfaces, por lo que puede presionar Done y ocultar el teclado, pero en ese caso debe adjuntar el método IBAction anterior al evento Finalizar al Did end on exit .

Y de esta manera, el teclado se ocultará touching outside o tocando Done desde el teclado.

Si desea mejorar el código, si solo oculta el teclado tocando Done desde el teclado, el método debe ser:

// Attach all textFields here on Did end on exit event, will not work if touch outside the keyboard - (IBAction) hideKeyboard: (id) sender { [sender resignFirstResponder]; }


Si estás en un UITableViewController o tienes un UITableView que el usuario interactuará, en tu ViewDidLoad simplemente puedes hacer:

tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

Nota: esta es la sintaxis de Xamarin.iOS.


Deberá agregar un UITapGestureRecogniser y asignarlo a la vista, y luego llamar a resignar al primer respondedor en el campo de texto en su selector.

El código:

En viewDidLoad

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

En el dismissKeyboard:

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

(Donde aTextField es el campo de texto que es responsable del teclado)

OPCION 2

Si no puede darse el lujo de agregar un gestor de reconocimiento, puede intentar esto

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