Como descartar teclado iOS de maneira programática ao pressionar Enter

105

Eu criei um UITextFieldprogramaticamente tornando a UITextFieldpropriedade a do viewController. Preciso dispensar o teclado com o retorno e o toque na tela. Consegui fazer com que o toque na tela fosse dispensado, mas pressionar voltar não está funcionando.

Eu vi como fazer isso com storyboards e alocando e inicializando o UITextFieldobjeto diretamente sem criá-lo como uma propriedade. Possível fazer?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#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
fonte

Respostas:

265

A maneira simples é conectar o delegado de UITextFielda self ( self.mytestField.delegate = self) e dispensar o teclado no método textFieldShouldReturnusando[textField resignFirstResponder];

Outra maneira de dispensar o teclado é a seguinte:

[self.view endEditing:YES];

Coloque [self.view endEditing:YES];onde deseja descartar o teclado (evento de botão, evento de toque, etc.).

Nitin Gohel
fonte
quando conecto o delegado, porém, recebo avisos e / ou erros. Já vi seu caminho antes, mas por algum motivo não consigo fazer funcionar. Esses métodos iriam para viewDidLoad?
noobsmcgoobs
1
Se você estava obtendo erros ao tentar definir o delegado textField para self, provavelmente não adicionou UITextFieldDelegate à definição da classe. Especificamente ... classe ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting
29

Adicione um método delegado UITextFieldcomo este:

@interface MyController : UIViewController <UITextFieldDelegate>

E defina seu e, em textField.delegate = self;seguida, adicione também dois 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
fonte
Devemos acrescentar que o acima só funciona, se o seu controlador implementar o UITextFieldDelegate assim: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK
@iPatel Eu coloquei esses 2 métodos, e também adicionei self.username.delegate = self e [self.username resignFirstResponder] em viewDidLoad. Isso funciona para os dois cenários de que eu precisava. Isso é normal ou estou usando muito código?
noobsmcgoobs
26

// Oculte o teclado tocando no fundo na visualização

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

simplesmente use isso rapidamente para dispensar o 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
fonte
SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
manhã de
17

SWIFT 4:

self.view.endEditing(true)

ou

Defina o delegado do campo de texto para o viewcontroller atual e:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Objective-C:

[self.view endEditing:YES];

ou

Defina o delegado do campo de texto para o viewcontroller atual e:

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

    return YES;
}
Sam
fonte
9

No App Delegate, você pode escrever

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

usar desta forma, você não pode escrever muito código.

DKong
fonte
7

Tente ter uma ideia sobre o que é um socorrista na hierarquia de visualização do iOS. Quando o seu campo de texto se torna ativo (ou primeiro respondente) quando você toca dentro dele (ou passa a mensagem becomeFirstResponderprogramaticamente), ele apresenta o teclado. Portanto, para remover o seu campo de texto de ser o primeiro a responder, você deve passar a mensagem resignFirstResponderpara ele.

[textField resignFirstResponder];

E para ocultar o teclado em seu botão de retorno, você deve implementar seu método delegado textFieldShouldReturn:e passar a resignFirstRespondermensagem.

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

Aqui está o que eu uso no meu código. Ele funciona como um encanto!

Em yourviewcontroller.h adicione:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Agora, no arquivo .m, adicione à sua função ViewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

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

Além disso, adicione esta função no arquivo .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
Takide
fonte
1
apenas lembre-se da ação: @selector deve chamar o mesmo nome do método onde você faz endEditing: SIM, neste caso "handleSingleTap:"
Marcos Reboucas
4

Para dispensar um teclado depois que ele foi aberto, existem 2 casos ,

  1. quando o UITextField está dentro de um UIScrollView

  2. quando o UITextField está fora de um UIScrollView

2. quando o UITextField está fora de um UIScrollView, substitua o método em sua subclasse UIViewController

você também deve adicionar delegado para todos os UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Em uma visualização de rolagem, tocar fora não irá disparar nenhum evento , então, nesse caso, use um Tap Gesture Recognizer , arraste e solte um UITapGesture para a visualização de rolagem e crie uma IBAction para ele .

para criar um IBAction, pressione ctrl + clique no UITapGesture e arraste-o para o arquivo .h do viewcontroller.

Aqui, chamei tappedEvent como meu nome de ação

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

as informações fornecidas acima foram obtidas no link a seguir, por favor, consulte para obter mais informações ou entre em contato comigo se você não compreender os dados acima.

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


fonte
Obrigado. Sua resposta me ajudou ..!
Archit Kapoor
4

Para um grupo de UITextViews dentro de ViewController:

Swift 3.0

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

Objective-C

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

Uma vez que as tags dizem apenas iOS, postarei a resposta para Swift 1.2 e iOs 8.4, adicione-os em sua classe do controlador de visualização:

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

Também não se esqueça de adicionar UITextFieldDelegate na declaração da classe e definir seu delegado de campos de texto para self (a visão).

Juan Boero
fonte
3

IN Swift 3

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

OU

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

Então aqui está o que eu fiz para dispensá-lo após tocar no fundo ou retornar. Tive de adicionar delegate = self em viewDidLoad e também os métodos de delegado posteriormente nos arquivos .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
fonte
2

Basta usar isso em Objective-C para dispensar o teclado:

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

Primeiro você precisa adicionar delegete textfield no arquivo .h. se não, declare (BOOL)textFieldShouldReturn:(UITextField *)textFieldeste método não chamado. então, primeiro adicione o delegado e escreva o código de ocultação do teclado nesse método.

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

tente este..

Jitendra
fonte
0

Adicionar delegado: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

e, em seguida, adicione este método delegado

// Isso deve funcionar perfeitamente

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

quando você usa mais de um campo de texto na tela Com este método você não precisa mencionar o campo de texto todas as vezes como

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

Swift 2:

isso é o que é feito para fazer tudo!

feche o teclado com o Donebotão ou Touch outSide, Nextpara ir para a próxima entrada.

Primeiro altere TextFiled Return Keypara Nextno 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
fonte
0

Se você não conhece o controlador de visualização atual ou visualização de texto, pode usar a cadeia de resposta:

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

para swift 3-4 eu consertei como

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

basta copiar e colar em qualquer lugar da classe. Esta solução só funciona se você quiser que todo o UItextfield funcione da mesma forma, ou se você tiver apenas um!

hall.keskin
fonte