Como ocultar o teclado quando pressiono a tecla Enter em um UITextField?

148

Clicar em um campo de texto faz o teclado aparecer. Como oculto quando o usuário pressiona a tecla Enter?

aden
fonte
13
O bom do Stack Overflow é que MUITAS perguntas já foram respondidas, especialmente as mais simples. Portanto, procure as respostas PRIMEIRO, antes de perguntar. Veja, é simples: stackoverflow.com/search?q=iphone+hide+keyboard
Felixyz 26/08/10
Esta é uma subclasse de UITextField que alterar dinamicamente a UIReturnKey acordo com a condição de texto / string: github.com/codeinteractiveapps/OBReturnKeyTextField
CodeInteractive

Respostas:

286

Primeiro, faça o seu arquivo delegar para UITextField

@interface MYLoginViewController () <UITextFieldDelegate>

@end

Em seguida, adicione esse método ao seu código.

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

Adicione também self.textField.delegate = self;

Saurabh
fonte
1
Curioso, por que <UITextFieldDelegate> não é necessário? Normalmente, você verá um aviso neste caso.
pixelfreak
7
se você fizer o seu delegado arquivo usando Interface Builder, em seguida, <UITextFieldDelegate> não é necessário no arquivo .h ..
Saurabh
1
adicionando <UITextFieldDelegate> no arquivo .h e defina delegate em viewdidload [yourTextField setDelegate: self]; irá completá-lo!
Umit Kaya
@Saurabh O que há de tão especial no VC criado pelo storyboard?
Paul Brewczynski
62

Em viewDidLoaddeclarar:

[yourTextField setDelegate:self];

Em seguida, inclua a substituição do método delegado:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
oscar castellon
fonte
6
+1 para o setDelegate:lembrete. Definitivamente tinha esquecido e o código não estava funcionando anteriormente.
Piperchester
2
Isso não deveria ser textField, em vez de yourTextField, como está sendo passado?
Clive Jefferies
é uma maneira de dizer que declarar o delegado do seu textField
oscar castellon
1
<UITextFieldDelegate> deve estar no arquivo .h, caso contrário, será exibido um aviso!
Umit Kaya
22

Tente isso em Swift ,

Etapa 1: defina o delegado como seu própriotextField

textField.delegate = self

Etapa 2: adicione este UITextFieldDelegate abaixo da sua declaração de classe,

extension YourClassName: UITextFieldDelegate {
    func textFieldShouldReturn(textField: UITextField) -> Bool {
         textField.resignFirstResponder()
        return true
    }
}
Mohammad Zaid Pathan
fonte
14

No Swift, faça o seguinte:
Primeiro no seu ViewControllerimplemento, UITextFieldDelegate por exemplo.

class MyViewController: UIViewController, UITextFieldDelegate {
....
}

Agora adicione um delegado a um TextFieldno qual você deseja descartar o teclado quando o retorno for tocado no viewDidLoadmétodo como abaixo ou onde você o está inicializando. Por exemplo.

override func viewDidLoad() {

    super.viewDidLoad()   
    myTextField.delegate = self
}

Agora adicione este método.

func textFieldShouldReturn(textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}
Homam
fonte
1
O segundo passo não é necessário se você definir delegado no IB.
precisa saber é o seguinte
Parece (nas versões atuais do Swift) deve haver um sublinhado antes de "textField:"
Bryce Sandlund
2

Tente isso,

[textField setDelegate: self];

Em seguida, no método delegado textField

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
Vineesh TP
fonte
essa não é a melhor prática para fazer isso.
orafaelreis
precisa UITextFieldDelegate na definição da interface.
Alp Altunel 6/0318
@AlpAltunel: Obrigado pelo comentário, foram 4 anos atrás.
Vineesh TP
1

Para definir o método delegate UITextFielde over ride, textFieldShouldReturnnesse método, basta escrever as seguintes duas linhas:

[textField resignFirstResponder];
return YES;

é isso aí. Antes de escrever um código, não se esqueça de definir o delegado de um UITextFielde definir o tipo de chave Return como "Concluído" na janela de propriedades (comando + shift + I).

Matriz
fonte
1

Você pode conectar "Ação primária acionada" (clique com o botão direito do mouse em UITextField) com uma IBAction e pode renunciar ao primeiro atendimento (sem delegação). Exemplo (Swift 4):

@IBAction func textFieldPrimaryAction(_ sender: UITextField) {
    sender.resignFirstResponder()
    ...
}
Ferenc Kiss
fonte
Maneira preferida se estiver usando storyboards.
lal 24/01
1

Swift 4

Defina delegar UITextFieldno controlador de exibição field.delegate = selfe, em seguida:

extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // don't force `endEditing` if you want to be asked for resigning
        // also return real flow value, not strict, like: true / false
        return textField.endEditing(false)
    }
}
dimpiax
fonte
como você lidaria com a necessidade de os usuários "tabularem" para o próximo campo de texto pressionando a tecla Enter, até o último e depois ele renunciar? Também no SwiftUI.
Learn2Code 15/03
O @ Learn2Code faz um gerente, coleciona campos de texto e encadeia, o último acionará a função de finalização.
dimpiax 16/03
1

Se você deseja ocultar o teclado para um uso específico do teclado [self.view resignFirstResponder]; Se você deseja ocultar qualquer teclado da vista, use[self.view endEditing:true];

Graycodder
fonte
0
[textField resignFirstResponder];

Usa isto

DURGESH
fonte
0

Ok, acho que para um iniciante as coisas podem ser um pouco confusas. Eu acho que a resposta correta é uma mistura de todos os itens acima, pelo menos no Swift4.

Crie uma extensão ou use o ViewController no qual você deseja usar isso, mas certifique-se de implementar o UITextFieldDelegate. Por uma questão de reutilização, achei mais fácil usar uma extensão:

extension UIViewController : UITextFieldDelegate {
    ...
}

mas a alternativa funciona também:

class MyViewController: UIViewController {
    ...
}

Adicione o método textFieldShouldReturn (dependendo da opção anterior, na extensão ou no seu ViewController)

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

No seu método viewDidLoad, defina o delegado do campo de texto como auto

@IBOutlet weak var myTextField: UITextField!
...

override func viewDidLoad() {
    ..
    myTextField.delegte = self;
    ..
}

Isso deve ser tudo. Agora, quando você pressiona returno botão textFieldShouldReturndeve ser chamado.

Alex
fonte
0

Defina esta classe e defina seu campo de texto para usá-la, e isso automatiza todo o teclado oculto quando o retorno é pressionado automaticamente.

class TextFieldWithReturn: UITextField, UITextFieldDelegate
{

    required init?(coder aDecoder: NSCoder) 
    {
        super.init(coder: aDecoder)
        self.delegate = self
    }

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

}

Então, tudo o que você precisa fazer no storyboard é definir os campos para usar a classe:

insira a descrição da imagem aqui

iphaaw
fonte