teclado quitar ocultar how esconder dismisskeyboard close ios cocoa-touch uitextfield uikit

ios - ocultar - quitar teclado en xcode



iOS-Descartar el teclado al tocar fuera de UITextField (30)

Me pregunto cómo hacer que el teclado desaparezca cuando el usuario toca fuera de un UITextField .


Esto funciona

En este ejemplo, aTextField es el único UITextField ... Si hay otros o UITextViews, hay un poco más que hacer.

// YourViewController.h // ... @interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol // ... @end // YourViewController.m @interface YourViewController () @property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer; @end // ... @implementation @synthesize singleTapRecognizer = _singleTapRecognizer; // ... - (void)viewDidLoad { [super viewDidLoad]; // your other init code here [self.view addGestureRecognizer:self.singleTapRecognizer]; { - (UITapGestureRecognizer *)singleTapRecognizer { if (nil == _singleTapRecognizer) { _singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)]; _singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events. } return _singleTapRecognizer; } // Something inside this VC''s view was tapped (except the navbar/toolbar) - (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender { NSLog(@"singleTap"); [self hideKeyboard:sender]; } // When the "Return" key is pressed on the on-screen keyboard, hide the keyboard. // for protocol UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField*)textField { NSLog(@"Return pressed"); [self hideKeyboard:textField]; return YES; } - (IBAction)hideKeyboard:(id)sender { // Just call resignFirstResponder on all UITextFields and UITextViews in this VC // Why? Because it works and checking which one was last active gets messy. [aTextField resignFirstResponder]; NSLog(@"keyboard hidden"); }


¿Qué tal esto? Sé que este es un post viejo. Podría ayudar a alguien :)

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSArray *subviews = [self.view subviews]; for (id objects in subviews) { if ([objects isKindOfClass:[UITextField class]]) { UITextField *theTextField = objects; if ([objects isFirstResponder]) { [theTextField resignFirstResponder]; } } } }


Agregue este código en su archivo ViewController.m :

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


Comprueba esto, esta sería la forma más fácil de hacerlo,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES];// this will do the trick }

O

Esta biblioteca se encargará de incluir el desplazamiento automático de la barra de desplazamiento, tocar el espacio para ocultar el teclado, etc.

https://github.com/michaeltyson/TPKeyboardAvoiding


Creo que la forma más fácil (y mejor) de hacer esto es subclasificar su vista global y usar el hitTest:withEvent para escuchar cualquier toque. Los toques en el teclado no están registrados, por lo que hitTest: withEvent solo se llama cuando toca / scroll / swipe / pinch ... en otra parte, luego llame a [self endEditing:YES] .

Esto es mejor que usar touchesBegan porque touchesBegan no se llama si hace clic en un botón en la parte superior de la vista. Es mejor que UITapGestureRecognizer que no puede reconocer un gesto de desplazamiento, por ejemplo. También es mejor que usar una pantalla oscura porque en una interfaz de usuario compleja y dinámica, no se puede colocar una pantalla oscura en todas partes. Además, no bloquea otras acciones, no es necesario tocar dos veces para seleccionar un botón externo (como en el caso de un UIPopover ).

Además, es mejor que llamar a [textField resignFirstResponder] , ya que puede tener muchos campos de texto en pantalla, por lo que esto funciona para todos ellos.


Deberá agregar un UITapGestureRecogniser y asignarlo a la vista, y luego llamar a resignar al primer respondedor en el UITextField 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 { [aTextField resignFirstResponder]; }

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

La versión Swift 3 se ve así

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

Para despedir Teclado

func dismissKeyboard (_ sender: UITapGestureRecognizer) { aTextField.resignFirstResponder() }


En este caso, se puede usar ScrollView y agregarlo a TextField en ScrollView y quiero Toque ScrollView y View y luego descartar el teclado. Traté de crear código de ejemplo por si acaso. Me gusta esto,

import UIKit class ViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:))) view.addGestureRecognizer(tapGesture) // Do any additional setup after loading the view, typically from a nib. } func tap(gesture: UITapGestureRecognizer) { textField.resignFirstResponder() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

Tu guión gráfico Mira eso como.


Envíe el mensaje resignFirstResponder al resignFirstResponder de texto que lo puso allí. Por favor, consulte esta publicación para más información.


Es mejor hacer que su UIView una instancia de UIControl (en el constructor de interfaces) y luego conectar su evento dismissKeyboard a dismissKeyboard método de dismissKeyboard del dismissKeyboard . Este método de IBAction se verá así:

- (IBAction)dismissKeyboard:(id)sender { [aTextBox resignFirstResponder]; }



Esta es una buena solución genérica:

C objetivo:

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

Rápido:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { self.view.endEditing(true) }

Basado en la solución @icodebuster: https://.com/a/18756253/417652


Hice unas cuantas respuestas.

Use un ivar que se inicialice durante viewDidLoad:

UIGestureRecognizer *tapper; - (void)viewDidLoad { [super viewDidLoad]; tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; tapper.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapper]; }

Descartar lo que se esté editando actualmente:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender { [self.view endEditing:YES]; }


Muchas respuestas geniales aquí sobre el uso de UITapGestureRecognizer cuales rompen el UITextField claro (X) de UITextField . La solución es suprimir el reconocedor de gestos a través de su delegado:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]]; BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]]; return !(touchViewIsButton && touchSuperviewIsTextField); }

No es la solución más robusta pero funciona para mí.


Probé muchas de las respuestas aquí y no tuve suerte. Mi reconocedor de gestos de toques siempre hacía que mis UIButtons no respondieran cuando se pulsaban, incluso cuando establecía la propiedad cancelsTouchesInView del reconocedor de gestos en NO.

Esto es lo que eventualmente resolvió el problema:

Tener un ivar:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

Cuando un campo de texto comienza a editarse, configure el reconocedor de gestos:

- (void) textFieldDidBeginEditing:(UITextField *)textField { if(_keyboardDismissGestureRecognizer == nil) { _keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)] autorelease]; _keyboardDismissGestureRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer]; } }

Entonces el truco está en cómo configurar el método de despido de la pizarra:

- (void) dismissKeyboard { [self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01]; } - (void) dismissKeyboardSelector { [self.view endEditing:YES]; [self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer]; _keyboardDismissGestureRecognizer = nil; }

Supongo que hay algo acerca de cómo obtener la ejecución de desperdicio de pantalla de la pila de ejecución de manejo táctil ...


Puede crear una categoría para UiView y anular el touchesBegan meathod de la siguiente manera.

Está funcionando bien para mí. Y es una solución centralizada para este problema.

#import "UIView+Keyboard.h" @implementation UIView(Keyboard) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.window endEditing:true]; [super touchesBegan:touches withEvent:event]; } @end


Puede usar el método UITapGestureRecongnizer para descartar el teclado haciendo clic fuera de UITextField. Al usar este método cada vez que el usuario haga clic fuera de UITextField, el teclado se cerrará. A continuación se muestra el fragmento de código para su uso.

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissk)]; [self.view addGestureRecognizer:tap]; //Method - (void) dismissk { [abctextfield resignFirstResponder]; [deftextfield resignFirstResponder]; }


Puedes hacer esto usando el Storyboard en XCode 6 y más:


Crea la acción para ocultar el teclado.

Agregue esto al archivo de encabezado de la clase utilizada por su ViewController:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate> - (IBAction)dissmissKeyboardOnTap:(id)sender; @end

Luego agregue esto al archivo de implementación del mismo ViewController:

- (IBAction)dissmissKeyboardOnTap:(id)sender{ [[self view]endEditing:YES]; }

Esta será ahora una de las ''Acciones recibidas'' para la escena de su guión gráfico (por ejemplo, ViewController):


Conecta la acción al evento de usuario.

Ahora necesita conectar esta acción al gesto del usuario de tocar el teclado.

Importante: debe convertir el ''UIView'' contenido en su guión gráfico a un UIControl , para que pueda recibir eventos. Seleccione la vista de la jerarquía de escenas de View Controller:

... y cambia su clase:

Ahora arrastre desde el pequeño círculo al lado de la ''acción recibida'' para su escena, a una parte ''vacía'' de su escena (en realidad, está arrastrando la ''Acción recibida'' a la UIControl). Se le mostrará una selección de eventos a los que puede conectar su acción para:

Seleccione la opción ''retocar dentro''. Ahora ha enganchado la acción IBA que creó a una acción del usuario de tocar el teclado. Cuando el usuario toca el teclado, ahora estará oculto.

(NOTA: para enlazar la acción al evento, también puede arrastrar desde la acción recibida directamente al UIControl en su jerarquía de Controladores de Vista. Se muestra como ''Control'' en la jerarquía.)


Si la vista está incrustada en un UIScrollView , puede usar lo siguiente:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

El primero animará el teclado fuera de la pantalla cuando se desplace la vista de la tabla y luego ocultará el teclado como la aplicación de Mensajes de valores.

Tenga en cuenta que estos están disponibles en iOS 7.0 o superior.


Si lo entiendo bien, usted quiere renunciar al tecleado del teclado en la parte exterior del textfield de textfield pero no tiene referencia de su campo de textfield .

Prueba esto;

  • Toma global textField, llamémoslo reftextField
  • Ahora, en textFieldDidBeginEditing ajuste el campo de texto referenciado a

    - (void) textFieldDidBeginEditing:(UITextField *)textField{ reftextField = textField; }

  • Ahora puede usarlo alegremente en cualquier reloj de botón (agregando un botón transparente para comenzar la edición recomendada)

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

  • O para renunciar al botón hecho intente esto.

    //for resigning on done button - (BOOL) textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; }


Solo para agregar a la lista aquí mi versión de cómo descartar un teclado con un toque externo.

viewDidLoad:

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

En cualquier sitio:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ [textFieldName resignFirstResponder]; puts("Dismissed the keyboard"); }


Swift 4 oneliner

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))


Una de las maneras más fáciles y cortas es agregar este código a su viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];


Utilicé el ejemplo de Barry para mi nuevo desarrollo. ¡Funcionó muy bien! pero tuve que incluir un pequeño cambio, requerido para descartar el teclado solo para el campo de texto que se está editando.

Entonces, agregué a Barry el siguiente ejemplo:

- (void) textFieldDidBeginEditing:(UITextField *)textField { _textBeingEdited = textField; } -(void) textFieldDidEndEditing:(UITextField *)textField { _textBeingEdited = nil; }

Además, cambié el método hideKeyboard de la siguiente manera:

- (IBAction)hideKeyboard:(id)sender { // Just call resignFirstResponder on all UITextFields and UITextViews in this VC // Why? Because it works and checking which one was last active gets messy. //UITextField * tf = (UITextField *) sender; [_textBeingEdited resignFirstResponder]; }


Veo que algunas personas tienen problemas con el método UITapGestureRecognizer . La forma más sencilla en la que he logrado esta funcionalidad sin dejar de mantener intacto el comportamiento de pulsación de mi botón existente es agregar solo una línea a la respuesta de @ Jensen2k:

[tap setCancelsTouchesInView:NO];

Esto permitió que mis botones existentes aún funcionaran sin usar el método de @Dmitry Sitnikov.

Lea acerca de esa property aquí (busque CancelsTouchesInView ): UIGestureRecognizer Class Reference

No estoy seguro de cómo funcionaría con las barras de desplazamiento, ya que veo que algunos tuvieron problemas, pero espero que alguien más se encuentre con el mismo escenario que yo tuve.


Versión Swift, esto funciona en combinación con otros elementos (como un UIButton u otro UITextField ):

override func viewDidLoad() { super.viewDidLoad() let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing)) tapper.cancelsTouchesInView = false view.addGestureRecognizer(tapper) }


Versión rápida de la respuesta de @Jensen2k:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard") self.view.addGestureRecognizer(gestureRecognizer) func dismissKeyboard() { aTextField.resignFirstResponder() }

Un trazador de líneas

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))


Swift 4

Configure su UIViewController con este método de extensión una vez, por ejemplo, en viewDidLoad :

override func viewDidLoad() { super.viewDidLoad() self.setupHideKeyboardOnTap() }

y el teclado se cerrará incluso tocando la NavigationBar .

import UIKit extension UIViewController { /// Call this once to dismiss open keyboards by tapping anywhere in the view controller func setupHideKeyboardOnTap() { self.view.addGestureRecognizer(self.endEditingRecognizer()) self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer()) } /// Dismisses the keyboard from self.view private func endEditingRecognizer() -> UIGestureRecognizer { let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:))) tap.cancelsTouchesInView = false return tap } }


- (void)viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; [singleTapGestureRecognizer setNumberOfTapsRequired:1]; [singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer]; [self.view addGestureRecognizer:singleTapGestureRecognizer]; } - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer { [self.view endEditing:YES]; [textField resignFirstResponder]; [scrollView setContentOffset:CGPointMake(0, -40) animated:YES]; }


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first{ view.endEditing(true) } }


  • Establecer campos de texto delegado en la vista se cargó:

    override func viewDidLoad() { super.viewDidLoad() self.userText.delegate = self }

  • Añadir esta función:

    func textFieldShouldReturn(userText: UITextField!) -> Bool { userText.resignFirstResponder() return true; }