Como ocultar rapidamente o teclado ao pressionar a tecla Enter?


214

Estou usando UITextfiedenquanto clico no teclado textfied aparecer, mas quando pressionei a returntecla, o teclado não está desaparecendo. Eu usei o seguinte código:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

o método resignfirstresponder não está entrando na função.


10
você considerou aceitar a resposta do RSC? aceitar respostas é o que faz esse local funcionar e é considerado uma boa prática.
Juan Boero

7
se alguma resposta atender aos seus requisitos, marque como resposta para que outras pessoas possam obter ajuda.
Syed Md. Kamruzzaman 8/03/16

Respostas:


397

Você pode fazer o aplicativo dispensar o teclado usando a seguinte função

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

Aqui está um exemplo completo para ilustrar melhor isso:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

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

Origem do código: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
Estava faltando "self.myTextField.delegate = self;" Obrigado!
tylerlindell

4
Eu estava sentindo falta do UITextFieldDelegate!
Cesare

1
@kommradHomer, sem dúvida, há outra coisa que está fazendo o teclado não aparecer. Se você quiser, coloque seu código em pastebin e cole o link aqui para eu ver.
rsc

1
@RSC você provavelmente estava certo. eu sou um novato 2 dias no iOS, então de alguma forma se livrou do meu problema e tudo funcionou como você sugeriu :)
kommradHomer

1
Então trabalhe para mim (swift 3): func textFieldShouldReturn(textField: UITextField) -> Bool {mude para func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg

112

A return trueparte disso informa apenas ao campo de texto se é permitido retornar ou não.
Você deve informar manualmente o campo de texto para descartar o teclado (ou o que quer que seja o primeiro a responder), e isso é feito da seguinte resignFirstResponder()maneira:

// Called on 'Return' pressed. Return false to ignore.

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

2
obrigado ... no meu caso "resignFirstResponder ()" método não estava recebendo automaticamente e eu pensei que não estava apoiando, mas enquanto escrevia manualmente o seu trabalho bem .. obrigado que estou procurando.
Ashwinkumar Mangrulkar

@AshwinMangrulkar, você pode esperar que na versão beta do Xcode 6 o recurso de preenchimento automático possa ser prejudicado.
Paul Brewczynski

1
e, é claro, o ponto-e-vírgula após "true" não é mais necessário
36

1
não é um requisito que o seu viewController esteja em conformidade UITextFieldDelegate?
Honey

1
em vez de self.view.endEditing () esta resposta é adequada e a abordagem correta
saigen

45
  • Adicione UITextFieldDelegateà declaração de classe:

    class ViewController: UIViewController, UITextFieldDelegate
  • Conecte textfieldou escreva programaticamente

    @IBOutlet weak var userText: UITextField!
  • defina seu controlador de exibição como os campos de texto delegados na exibição foram carregados:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Adicione a seguinte função

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

    com tudo isso, seu teclado começará a ser descartado tocando fora do campo de texto e pressionando a tecla Enter.


Valeu cara! Eu estava sentindo falta disso: UITextFieldDelegate... muito obrigado!
Adriano Tadao

Por alguma razão, quando eu definir o txtField.delegate = auto, eu não posso digitar dentro desse campo de texto uma vez que eu executar o aplicativo
Jesus Rodriguez

@JesusAdolfoRodriguez, deve haver uma razão por trás desse erro, embora este código não cause nenhum problema. : D Feliz codificação!
Codetard

Obrigado pelo passo a passo. Isso foi mais útil para mim do que apenas um bloco de código.
precisa saber é o seguinte

1
"com tudo isso, seu teclado começará a ser descartado tocando fora do campo de texto" - Não é verdade. O textFieldShouldReturn é chamado apenas ao pressionar o botão de retorno.
Jurasic

38

Swift 4.2 - Não é necessário delegar

Você pode criar uma saída de ação do UITextField para a " Ação primária acionada " e renunciar a primeira resposta no parâmetro sender passado:

Criar tomada de ação

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

Super simples.

(Obrigado ao vídeo de 60 segundos de Scott Smith por me informar sobre isso: https://youtu.be/v6GrnVQy7iA )


se tivermos vários campos de texto em uma página, será necessário fazê-lo para cada campo de texto ... #
187

@DragonFire Você pode atribuir vários campos de texto à mesma tomada. Arraste Apenas a partir da ação primária Provocado tomada no Inspetor de saída (lado esquerdo da tela) para o IBAction em seu código
Brad Root

É bom observar que arrastar diretamente do campo de texto no storyboard padronizará a ação vinculada para Edição finalizada, em vez de Ação primária acionada, portanto, isso deve ser feito no Inspetor de conexões da barra lateral.
Cloud

Surpreendente. Eu não sabia disso. Obrigado.
Numan Karaaslan

Também funciona com o Swift 2, se alguém ainda se importa. Obrigado.
siralexsir88

22

Solução Simple Swift 3: Adicione esta função aos controladores de exibição que apresentam um campo de texto:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

Em seguida, abra o editor assistente e verifique se o Main.storyboard está em um lado da sua visualização e o arquivo controller.swift da visualização desejado está no outro. Clique em um campo de texto e selecione no painel de utilitários do lado direito a guia 'Mostrar o Inspetor de Conexão'. Arraste a tecla Control de 'Terminou ao sair' para a função acima no seu arquivo rápido. Repita o procedimento para qualquer outro campo de texto nessa cena e vincule à mesma função.


14

@RSC

para mim, a adição crítica no Xcode Versão 6.2 (6C86e) está em override func viewDidLoad()

 self.input.delegate = self;

Tentei fazê-lo funcionar com a chave de retorno por horas até encontrar sua postagem, RSC. Obrigado!

Além disso, se você deseja ocultar o teclado, se tocar em qualquer outro lugar na tela:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }

12

Para obter a dispensa automática do teclado, coloquei esse código em um dos métodos da classe do meu campo de texto personalizado:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

Substitua o nome da sua tomada por textField.


1
Excepcional. Esta é a opção mais curta e melhor na minha opinião. Especialmente quando você está criando um campo de texto dentro de outro método. Como dentro de um cabeçalho de exibição de tabela.
precisa saber é

Desculpe, onde exatamente você deve colocar isso e o que você precisa fazer para fechar o teclado? Coloquei mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(versão Swift 5) em, viewDidLoadmas nem retornei nem toquei em algum lugar fora do campo de texto funcionou. Eu consegui os campos de texto criando uma saída cada.
Neph 27/06/19

Coloquei-o em uma subclasse de uma classe personalizada que herda de UIViewController. A subclasse também está em conformidade com UITextViewDelegate e UITextFieldDelegate. Eu coloquei no viewDidAppearmétodo dessa classe. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Isso pode ser um pouco específico demais para o meu caso, mas espero que ajude. Tente fazer a ligação dentro viewDidAppeare em conformidade com os delegados, se necessário.
peacetype 27/06/19

10

Outra maneira de fazer isso que usa principalmente o storyboard e permite facilmente que você tenha vários campos de texto é:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

Conecte todos os seus campos de texto para esse controlador de exibição a essa ação no Did End On Exitevento de cada campo.


Desculpe o problema, mas estou tentando esse método no meu aplicativo e ele não parece estar funcionando. Eu tenho um campo de texto na barra de navegação e o conectei a essa ação com esse evento, como você disse, mas não funciona em tempo de execução.
wasimsandhu

Isso falharia se o remetente fosse do tipo UIBarButtonItem. Se eu adicionar barra de ferramentas com o botão Concluído ao teclado numérico, seu código poderá falhar com o seletor não reconhecido enviado ao log da instância.
Jayprakash Dubey

8

Eu sugeriria iniciar a classe do RSC:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}


8

Quando o usuário toca no botão Concluído no teclado de texto, um evento Terminou ao sair será gerado; nesse momento, precisamos dizer ao campo de texto para abrir mão do controle para que o teclado desapareça. Para fazer isso, precisamos adicionar um método de ação à nossa classe de controlador. Selecione ViewController.swift e adicione o seguinte método de ação:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

Selecione Main.storyboard no Project Navigator e abra o inspetor de conexões. Arraste do círculo ao lado de Terminou ao sair para o ícone amarelo do View Controller no storyboard e solte-o. Um pequeno menu pop-up aparecerá, contendo o nome de uma única ação, a que acabamos de adicionar. Clique na ação textFieldDoneEditing para selecioná-lo e pronto.


8

Aqui está a atualização do Swift 3.0 para o comentário do peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

esta é uma resposta limpa
po5i 28/02

Essa deve ser a resposta aceita. Trabalhou em uma única tentativa.
Jaswant Singh

7

Detesto adicionar a mesma função a todos os UIViewController. Estendendo o UIViewController para oferecer suporte ao UITextFieldDelegate, você pode fornecer um comportamento padrão de "retorno pressionado".

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

Quando você cria novos UIViewController e UITextField, tudo o que você precisa fazer é escrever um código de linha no seu UIViewController.

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

Você pode até omitir esse código de uma linha conectando delegate no Main.storyboard. (Usando "ctrl" e arraste de UITextField para UIViewController)


5

Swift 3

Adicione este código abaixo ao seu VC

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

Funciona para mim


3

Verifique se o seu delegado textField está definido como o controlador de exibição no qual você está escrevendo seu código relacionado ao campo de texto.

self.textField.delegate = self

3

Rápido

Usando a função opcional de UITextFieldDelegate.

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

falsesignifica que esse campo pode ser solicitado a renunciar. true- forçar demissão.


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

então você usa esta função

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

você pode colocar isso em qualquer lugar, mas não em um UIButton

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

então você pode colocar esse código em um botão (também por exemplo):

self.view.endEditing(true)

isso funcionou para mim


2

No controlador de exibição que você está usando:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

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

Eu gosto da função touchesBegan, funciona no swift 4 obrigado.
AJ Hernandez

-1

você deve conectar o UITextfied a um controlador de delegado de visão para tornar essa função chamada


-1

Tudo em um ocultar o teclado e mover a exibição no teclado aberto: Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.