¿Cómo descartar el keyboard cuando el usuario pulsa otra área fuera del campo de text?

hoy intenté ejecutar mi código en mi iPod (iOS 6.1.3) y encontré algo interesante aquí …

primero, cuando toco el campo de text, aparece el keyboard, pero no se oculta cuando toco en otro lugar fuera del campo de text.

así que decidí search en Google y encontré esta solución:

_fieldEmail.delegate = self; _fieldEmail.returnKeyType = UIReturnKeyDone; _fieldPassword.delegate = self; _fieldPassword.returnKeyType = UIReturnKeyDone; _fieldRegisterName.delegate = self; _fieldRegisterName.returnKeyType = UIReturnKeyDone; _fieldRegisterEmail.delegate = self; _fieldRegisterEmail.returnKeyType = UIReturnKeyDone; _fieldRegisterPassword.delegate = self; _fieldRegisterPassword.returnKeyType = UIReturnKeyDone; 

funciona … da un button 'DONE' en la parte inferior del keyboard y ahora se puede ocultar el keyboard presionándolo.

pero tengo 2 problemas aquí:

  1. el keyboard solo se oculta cuando se toca el button 'DONE'. no tocando otra área fuera del campo de text. No sé si esto es normal en el mundo iOS, pero generalmente veo que muchas aplicaciones no actúan así.
  2. ¿Hay alguna forma de hacer un ciclo de este process, así que no tengo que agregar manualmente ese delegado uno por uno de todos los campos de text que tengo? ¿como hacer eso?

eso es todo lo que necesito saber

El código siguiente funcionará en todos los componentes en la UIView para todos los UITextField

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for (UIView * txt in self.view.subviews){ if ([txt isKindOfClass:[UITextField class]] && [txt isFirstResponder]) { [txt resignFirstResponder]; } } } 

O

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 
  1. Simplemente agregue un UITapGestureRecogniser a su vista que llevará a llamar a resignFirstResponder

En viewDidLoad:

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

Y entonces :

 -(void)hideKeyBoard { [yourTextField resignFirstResponder]; } 

2. Podría subclass UITextField, pero a less que tenga 1000 textFields, está bien hacer lo que hace actualmente.

Esto se refiere a la progtwigción Swift para Xcode 6.0.1

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:") tapRecognizer.numberOfTapsRequinetworking = 1 self.view.addGestureRecognizer(tapRecognizer) } func handleSingleTap(recognizer: UITapGestureRecognizer) { self.view.endEditing(true) } 

Utilizar cualquiera

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

y codigo de metodo

 -(void)handleSingleTap:(UITapGestureRecognizer *)sender{ [self.TextFiledName resignFirstResponder]; } 

O _ y la mejor opción es otra

Solo agrega

  [self.view endEditing:YES]; 

Y la placa de keyboard se esconderá cuando toque desde cualquier punto de vista 🙂

Descartar el keyboard

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

Lo que suelo hacer es llamar

 [field resignFirstResponder]; 

desde un button invisible sobre la vista. Estoy seguro de que hay una forma más agradable de hacerlo. Ha pasado un time desde que lo hice en una aplicación.

Sencillo,

Use IQKeyboardManager y coloque esta línea de código en AppDelegate.m

 [[IQKeyboardManager shanetworkingManager] setShouldResignOnTouchOutside:YES]; 

Así es como lo hago:

En el file .h de myView:

 @property (strong) UITextField * savedTextField; 

En el file .m de myView:

 @implementation myView @synthesize savedTextField; 

En la rutina init de myView:

 [self setSavedTextField: nil]; 

En el área del delegado textField de myView, guardo el id de cualquier textField que se está activando actualmente:

 - (BOOL) textFieldShouldBeginEditing: (UITextField *) textField { [self setSavedTextField: textField]; . . . return( YES ); } 

Y en la rutina de myView que enruta todo el tráfico de los otros controles cuando se accede a ellos, tengo un código que busca ver si un campo de text estaba activo y, si lo hubiera, lo invoca para renunciar a su estado de FirstResponder y luego deja caer un nil en la propiedad savedTextField:

 - (void) handleCtrlEvents: (UIControl *) aCtrl { if ( [self savedTextField] != nil ) { [[self savedTextField] resignFirstResponder]; [self setSavedTextField: nil]; } . . . } 

Esto funciona limpio para mí.

Me encontré con el mismo problema. Por lo general, lo que quieres es que cuando hagas clic dentro de tu aplicación (que se muestra en tu UIView principal / actual), pero no en el keyboard para cerrarlo. Después de search en la web una solución inteligente y probar varias, creo que es lo mejor para extender / subclass / implementar el UIGestureRecognizerDelegate

Dado que muchos controles, como UITableView, etc. pueden responder a gestos (seleccionar, desplazarse, etc.) y si simplemente agrega un UITapGestureRecognizer a la vista de ViewController (principal) para cerrar el keyboard, la experiencia del usuario no es la mejor, ya que el usuario debe pulsar dos veces si no tenía la intención de cerrar el keyboard, pero, por ejemplo, seleccionar una fila de un UITableView dentro de la vista "principal" actual de la aplicación.

Como soy bastante nuevo en todo lo iOS y lo rápido y los ejemplos de código rápido son raros, aquí está el control total de mi keyboard:

 class ViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLoad(){ self.initializeCloseKeyboardTap() } func initializeCloseKeyboardTap() { NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardOpen:", name: UIKeyboardDidShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardClose:", name: UIKeyboardDidHideNotification, object: nil) let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleOnTapAnywhereButKeyboard:") tapRecognizer.delegate = self //delegate event notifications to this class self.view.addGestureRecognizer(tapRecognizer) } func onKeyboardClose(notification: NSNotification) { println("keyboardClosed") } func onKeyboardOpen(notification: NSNotification) { println("keyboardOpen") } func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { self.view.endEditing(true) return false } 

puede anidar dentro del ViewController y llamar a initiallizeCloseKeyboardTa () en la implementación viewDidLoad … También implementa un observador de norficación para recibir events tan pronto como el keyboard (finalizado para ser) se abre o se cierra a través de NSNotificationCenter UIKeyboardDidShowNotification y UIKeyboardDidHideNotification

Espero que otras personas salven algo de time 🙂

| * | Descartar el keyboard de UITextField: anular el método touchesBegan: withEvent: para el ViewController

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { view.endEditing(true) super.touchesBegan(touches, withEvent: event) } 

| O |

 override func viewDidLoad() { super.viewDidLoad() // For tapping outside text box self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc))) } // For tapping outside text box func DismisKeyPadFnc() { view.endEditing(true) } 

| * | Descartar el keyboard de UITextField en un textbox induvidual:

 class NamVcc: UIViewController, UITextFieldDelegate { @IBOutlet var NamTxtBoxVid: UITextField! override func viewDidLoad() { super.viewDidLoad() // For hitting return key NamTxtBoxVid.delegate = self // For tapping outside text box self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc))) } /* For hitting return key */ func textFieldShouldReturn(NamTxtBoxPsgVid: UITextField) -> Bool { NamTxtBoxPsgVid.resignFirstResponder() return true } /* For tapping outside text box */ func DismisKeyPadFnc() { view.endEditing(true) } } 

| * | Implementando el button Siguiente Haga clic en:
1) Necesitará configurar las tags en la secuencia incremental de los campos de text en xib / Storyboard o en el código.
2) Establezca el delegado para cada uno de los campos de text.
3) Luego, pegue el siguiente código en su controller de vista para tener el efecto deseado:

 func textFieldShouldReturn(TxtBoxPsgVar: UITextField) -> Bool { let NxtTxtBoxTagVal : Int = TxtBoxPsgVar.tag + 1 let NxtTxtBoxVal: UIResponder? = TxtBoxPsgVar.superview?.superview?.viewWithTag(NxtTxtBoxTagVal) if let TxtBoxVal = NxtTxtBoxVal { // Found next responder, so set it. TxtBoxVal.becomeFirstResponder() } else { // Not found, so remove keyboard. TxtBoxPsgVar.resignFirstResponder() } return true } 

creo

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

es conveniente pero no la mejor solución. y el TapGestureRecongnizer es mejor pero difícil de usar, debes configurar delegates y agregar y eliminar Recongnizer. Entonces escribí una subclass simple que puede usarse fácilmente:

 class TapHideTextField: UITextField { override func awakeFromNib() { super.awakeFromNib() tapGr = UITapGestureRecognizer(target: self, action:"tap") NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBeginEditing", name:UITextFieldTextDidBeginEditingNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEndEditing", name:UITextFieldTextDidEndEditingNotification, object: nil) } deinit{ NSNotificationCenter.defaultCenter().removeObserver(self) } var tapGr:UITapGestureRecognizer! func tap(){ self.endEditing(true) } func didBeginEditing(){ self.superview!.addGestureRecognizer(tapGr) } func didEndEditing(){ self.superview!.removeGestureRecognizer(tapGr) } 

}

debe preocuparse por la propiedad superview y cancelTouchesInView.

o en GitHub: https://github.com/lilidan/TapHideText/blob/master/TapHideTextField.swift

 -(void) textFieldDidBeginEditing: (UITextField *) textField{ [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DismissKeyboard:)]]; } -(void) DismissKeyboard:(UITapGestureRecognizer *) sender{ [self.view endEditing:YES]; [self.view removeGestureRecognizer:sender]; }