Cómo descartar el teclado iOS programáticamente al presionar regresar

UITextField un UITextField programáticamente haciendo que el UITextField propiedad de viewController. Necesito descartar el teclado con el retorno y el toque en la pantalla. Pude hacer que la pantalla táctil desapareciera, pero al presionar regresar no funcionaba.

He visto cómo hacerlo con guiones gráficos y al asignar e inicializar el objeto UITextField directamente sin crearlo como una propiedad. Posible hacer?

.h

 #import  @interface ViewController : UIViewController  @property (strong, atomic) UITextField *username; @end 

.metro

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor blueColor]; self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)]; self.username.placeholder = @"Enter your username"; self.username.backgroundColor = [UIColor whiteColor]; self.username.borderStyle = UITextBorderStyleRoundedRect; if (self.username.placeholder != nil) { self.username.clearsOnBeginEditing = NO; } _username.delegate = self; [self.view addSubview:self.username]; [_username resignFirstResponder]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"touchesBegan:withEvent:"); [self.view endEditing:YES]; [super touchesBegan:touches withEvent:event]; } @end 

La manera simple es conectar el delegado de UITextField a self ( self.mytestField.delegate = self ) y descartar el teclado en el método textFieldShouldReturn usando [textField resignFirstResponder];

Otra forma de ignorar el teclado es la siguiente:

 [self.view endEditing:YES]; 

Ponga [self.view endEditing:YES]; donde le gustaría descartar el teclado (evento de botón, evento táctil, etc.).

Agregue un método delegado de UITextField como este:

 @interface MyController : UIViewController  

Y configure su textField.delegate = self; luego también agregue dos métodos delegates de UITextField

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { return YES; } // It is important for you to hide the keyboard - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 

// Ocultar keyBoard tocando fondo en la vista

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

simplemente use esto rápidamente para cerrar el teclado:

 UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil) 

Swift 3

 UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil) 

Intente hacerse una idea de lo que es un primer respondedor en la jerarquía de vista de iOS. Cuando su campo de texto se activa (o el primero en responder) cuando toca dentro de él (o lo pasa el mensaje se becomeFirstResponder primer becomeFirstResponder respuesta becomeFirstResponder progtwigción), presenta el teclado. Por lo tanto, para eliminar su campo de texto de ser el primero en responder, debe pasar el mensaje resignFirstResponder allí.

 [textField resignFirstResponder]; 

Y para ocultar el teclado en su botón de retorno, debe implementar su método delegado textFieldShouldReturn: y pasar el mensaje resignFirstResponder .

 - (BOOL)textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; } 

En el delegado de la aplicación, puedes escribir

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

utilizar de esta manera, no puede escribir demasiado código.

Esto es lo que uso en mi código. ¡Funciona a las mil maravillas!

En yourviewcontroller.h, agregue:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Ahora en el archivo .m, agrégalo a tu función ViewDidLoad:

 - (void)viewDidLoad { [super viewDidLoad]; //Keyboard stuff tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; tapRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapRecognizer]; } 

Además, agregue esta función en el archivo .m:

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

SWIFT 4:

 self.view.endEditing(true) 

o

Establezca el delegado del campo de texto en el controlador de vista actual y luego:

 func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } 

C objective:

 [self.view endEditing:YES]; 

o

Establezca el delegado del campo de texto en el controlador de vista actual y luego:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 

Para descartar un teclado después de que el teclado ha aparecido, hay 2 casos ,

  1. cuando el UITextField está dentro de UIScrollView

  2. cuando el UITextField está fuera de UIScrollView

2.cuando el UITextField está fuera de UIScrollView, anula el método en su subclase UIViewController

también debe agregar delegado para todos UITextView

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 
  1. En una vista de desplazamiento, tocar fuera no activará ningún evento , por lo tanto, en ese caso, use un Reconocedor de toque , arrastre y suelte un UITapGesture para la vista de desplazamiento y cree un IBAction para él .

para crear un IBAction, presione ctrl + clic en UITapGesture y arrástrelo al archivo .h de viewcontroller.

Aquí he llamado a tappedEvent como mi nombre de acción

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

la información dada se derivó del siguiente enlace; consúltelo para obtener más información o contácteme si no comprende los datos de más.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

Como las tags solo dicen iOS, publicaré la respuesta para Swift 1.2 e iOs 8.4, agréguelas a su clase rápida de controlador de vista:

 // MARK: - Close keyboard when touching somewhere else override func touchesBegan(touches: Set, withEvent event: UIEvent) { self.view.endEditing(true) } // MARK: - Close keyboard when return pressed func textFieldShouldReturn(textField: UITextField!) -> Bool { textField.resignFirstResponder() return true } // MARK: - 

Además, no olvide agregar UITextFieldDelegate en la statement de clase y establecer los campos de texto delegates en self (la vista).

Para un grupo de UITextView dentro de ViewController :

Swift 3.0

 for view in view.subviews { if view is UITextField { view.resignFirstResponder() } } 

C objective

 // hide keyboard before dismiss for (UIView *view in [self.view subviews]) { if ([view isKindOfClass:[UITextField class]]) { // no need to cast [view resignFirstResponder]; } } 

Primero necesita agregar delegete de campo de texto en el archivo .h. si no declara (BOOL)textFieldShouldReturn:(UITextField *)textField este método no se llama. Primero, agregue delegar y escriba el código de ocultación del teclado en ese método.

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 

prueba este …

Así que esto es lo que hice para descartarlo después de tocar el fondo o regresar. Tuve que agregar delegate = self en viewDidLoad y luego también los métodos de delegado más adelante en los archivos .m.

 .h #import  @interface ViewController : UIViewController  @property (strong, atomic) UITextField *username; @end .m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor blueColor]; self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)]; self.username.placeholder = @"Enter your username"; self.username.backgroundColor = [UIColor whiteColor]; self.username.borderStyle = UITextBorderStyleRoundedRect; if (self.username.placeholder != nil) { self.username.clearsOnBeginEditing = NO; } self.username.delegate = self; [self.username resignFirstResponder]; [self.view addSubview:self.username]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { return YES; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } @end 

Sé que esto ha sido respondido por otros, pero encontré el otro artículo que también cubría ningún evento de fondo: vista de tabla o vista de desplazamiento.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

EN Swift 3

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { self.view.endEditing(true) } 

O

 func textFieldShouldReturn(_ textField: UITextField) -> Bool { if textField == yourtextfieldName { self.resignFirstResponder() self.view.endEditing(true) } } 

Agregar delegado: UITextFieldDelegate

 @interface ViewController : UIViewController  

y luego agrega este método delegado

// Esto debería funcionar perfectamente

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:[UITextField class]]) { [obj resignFirstResponder]; } }]; } 

cuando usa más de un campo de texto en la pantalla Con este método no necesita mencionar el campo de texto cada vez que

 [textField1 resignFirstResponder]; [textField2 resignFirstResponder]; 

Swift 2:

esto es lo que se hace para hacer todo!

cierre el teclado con el botón Done o Touch outSide , siga para ir a la siguiente entrada.

Primero, cambie la clave de Return Key a la Next en StoryBoard.

 override func viewDidLoad() { txtBillIdentifier.delegate = self txtBillIdentifier.tag = 1 txtPayIdentifier.delegate = self txtPayIdentifier.tag = 2 let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture") self.view.addGestureRecognizer(tap) } func textFieldShouldReturn(textField: UITextField) -> Bool { if(textField.returnKeyType == UIReturnKeyType.Default) { if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField { next.becomeFirstResponder() return false } } textField.resignFirstResponder() return false } func onTouchGesture(){ self.view.endEditing(true) } 

Si no conoce el controlador de vista actual o la vista de texto, puede usar la Cadena de respuesta:

 UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil) 

para swift 3-4 lo arreglé como

 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { return false } 

solo copie y pegue en cualquier lugar de la clase. ¡Esta solución solo funciona si quieres que todo UItextfield funcione igual, o si solo tienes uno!