Cómo descartar el teclado iOS mediante programación al presionar retorno

105

Creé una UITextFieldtoma de programación la UITextFieldpropiedad de la viewController. Necesito descartar el teclado con el retorno y el toque en la pantalla. Pude hacer que el toque de la pantalla se descartara, pero al presionar regresar no funciona.

He visto cómo hacerlo con guiones gráficos y asignando e inicializando el UITextFieldobjeto directamente sin crearlo como una propiedad. ¿Es posible hacer?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@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
noobsmcgoobs
fuente

Respuestas:

265

La forma simple es conectar el delegado de UITextFielda self ( self.mytestField.delegate = self) y descartar el teclado en el método textFieldShouldReturnusando[textField resignFirstResponder];

Otra forma de descartar el teclado es la siguiente:

[self.view endEditing:YES];

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

Nitin Gohel
fuente
sin embargo, cuando conecto al delegado, recibo advertencias y / o errores. He visto tu camino antes, pero por alguna razón no puedo hacer que funcione. ¿Estos métodos irían en viewDidLoad?
noobsmcgoobs
1
Si recibía errores cuando intentó establecer el delegado de textField en self, entonces probablemente no haya agregado UITextFieldDelegate a la definición de clase. Específicamente ... clase ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting
29

Agregue un método de delegado UITextFieldcomo este:

@interface MyController : UIViewController <UITextFieldDelegate>

Y configure su textField.delegate = self;luego también agregue dos métodos delegados deUITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
iPatel
fuente
Debemos agregar que lo anterior solo funciona, si su controlador implementa el UITextFieldDelegate así: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK
@iPatel Puse esos 2 métodos, y también agregué self.username.delegate = self y [self.username resignFirstResponder] en viewDidLoad. Esto funciona para los dos escenarios que necesitaba. ¿Es eso normal o estoy usando demasiado código?
noobsmcgoobs
26

// Ocultar el teclado tocando el fondo en la vista

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

simplemente use esto en rápido para descartar 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)
Chathuranga Silva
fuente
SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff
17

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 objetivo:

[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;
}
Sam
fuente
9

En la App Delegate, puede escribir

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

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

DKong
fuente
7

Intente tener una idea de lo que es un primer respondedor en la jerarquía de vistas de iOS. Cuando su campo de texto se activa (o el primero en responder) cuando toca dentro de él (o le pasa el mensaje mediante becomeFirstResponderprogramación), presenta el teclado. Entonces, para eliminar su campo de texto de ser el primer respondedor, debe pasarle el mensaje resignFirstResponderallí.

[textField resignFirstResponder];

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

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

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, agregue esto a su 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];
}
Takide
fuente
1
solo recuerda la acción: @selector debería llamar al mismo nombre de método donde terminas Editando: SÍ, en este caso "handleSingleTap:"
Marcos Reboucas
4

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

  1. cuando el UITextField está dentro de un UIScrollView

  2. cuando el UITextField está fuera de un UIScrollView

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

también debe agregar delegado para todos los UITextView

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

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

Aquí he nombrado tappedEvent como mi nombre de acción

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

La información proporcionada anteriormente se derivó del siguiente enlace, consulte para obtener más información o comuníquese conmigo si no comprende los datos anteriores.

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


fuente
Gracias. Tu respuesta me ayudó ..!
Archit Kapoor
4

Para un grupo de UITextViews dentro de un ViewController:

Swift 3.0

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

C objetivo

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

Dado que las etiquetas solo dicen iOS, publicaré la respuesta para Swift 1.2 e iOs 8.4, agréguelas en la clase rápida de su controlador de vista:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, 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 declaración de clase y configure sus campos de texto delegados en self (la vista).

Juan Boero
fuente
3

EN Swift 3

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

O

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

Entonces, esto es lo que hice para que se descarte 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 <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@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
noobsmcgoobs
fuente
2

Simplemente use esto en Objective-C para descartar el teclado:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
Linc
fuente
1

Primero debe agregar el campo de texto delegete en el archivo .h. si no, declare que (BOOL)textFieldShouldReturn:(UITextField *)textFieldeste método no se llama. Por lo tanto, primero agregue el delegado y escriba el código oculto del teclado en ese método.

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

prueba este ...

Jitendra
fuente
0

Agregar delegado: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

y luego agregue este método delegado

// Esto debería funcionar perfectamente

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
Ravi_Parmar
fuente
0
- (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, como

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
Harshad
fuente
0

Rápido 2:

¡esto es lo que se hizo para hacer todo!

cierre el teclado con el Donebotón o Touch outSide, Nextpara ir a la siguiente entrada.

Primero cambie TextFiled Return KeyTo Nexten 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)
}
Mojtabye
fuente
0

Si no conoce el controlador de vista actual o la vista de texto, puede usar Responder Chain:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
fuego frío
fuente
0

para swift 3-4 arreglé como

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

simplemente copie y pegue en cualquier parte de la clase. Esta solución simplemente funciona si desea que todos los campos de texto de la interfaz de usuario funcionen igual, ¡o si solo tiene uno!

hall.keskin
fuente