Come nascondere la tastiera rapidamente premendo il tasto Invio?


215

Sto usando UITextfiedmentre faccio clic sulla tastiera testurizzata appare ma quando ho premuto il returntasto, la tastiera non sta scomparendo. Ho usato il seguente codice:

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

il metodo resignfirstresponder non sta entrando in funzione.


10
hai considerato di accettare la risposta RSC? accettare le risposte è ciò che fa funzionare questo posto ed è considerato una buona pratica.
Juan Boero,

7
se una risposta soddisfa le tue esigenze, contrassegnala come risposta in modo che altre persone possano ottenere aiuto da essa.
Syed Md. Kamruzzaman

Risposte:


398

Puoi fare in modo che l'app rifiuti la tastiera usando la seguente funzione

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

Ecco un esempio completo per illustrare meglio che:

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

Fonte del codice: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
Mi mancava "self.myTextField.delegate = self;" Grazie!
Tylerlindell,

4
Mi mancava il UITextFieldDelegate!
Cesare,

1
@kommradHomer, senza dubbio c'è qualcos'altro che sta impedendo alla tua tastiera di mostrare. Se vuoi, metti il ​​tuo codice su pastebin e incolla qui il link per vederlo.
rsc,

1
@RSC probabilmente avevi ragione. Sono un principiante di 2 giorni su iOS, quindi in qualche modo mi sono sbarazzato del mio problema e tutto ha funzionato come hai suggerito :)
kommradHomer

1
Quindi lavora per me (swift 3): func textFieldShouldReturn(textField: UITextField) -> Bool {cambia in func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg

112

La return trueparte di questo indica solo al campo di testo se è consentito o meno restituire.
Devi dire manualmente al campo di testo di chiudere la tastiera (o qualunque sia il suo primo risponditore), e questo viene fatto resignFirstResponder(), in questo modo:

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

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

2
grazie ... nel mio caso il metodo "resignFirstResponder ()" non stava ottenendo automaticamente e ho pensato che non stava supportando ma mentre scrivevo manualmente funziona bene..grazie che sto cercando.
Ashwinkumar Mangrulkar,

@AshwinMangrulkar puoi aspettarti che nella versione beta di Xcode 6 la funzione di completamento automatico potrebbe essere handicappata.
Paul Brewczynski,

1
e ovviamente il punto e virgola dopo "vero" non è più richiesto
36 By Design

1
non è un requisito conforme al tuo viewController UITextFieldDelegate?
Miele,

1
invece di self.view.endEditing () questa risposta è appropriata e l'approccio corretto
saigen,

45
  • Aggiungi UITextFieldDelegatealla dichiarazione di classe:

    class ViewController: UIViewController, UITextFieldDelegate
  • Collegalo textfieldo scrivilo a livello di codice

    @IBOutlet weak var userText: UITextField!
  • imposta il controller di visualizzazione durante il caricamento dei delegati dei campi di testo in vista:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Aggiungi la seguente funzione

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

    con tutto ciò, la tastiera inizierà a chiudersi toccando all'esterno del campo di testo e premendo il tasto Invio.


Grazie uomo! Mi mancava questo: UITextFieldDelegate... grazie mille!
Adriano Tadao,

Per qualche motivo, quando imposto txtField.delegate = self, non riesco a digitare all'interno di quel campo di testo una volta eseguita l'app
Jesus Rodriguez,

@JesusAdolfoRodriguez ci deve essere una ragione dietro quell'errore, anche se questo codice non causa alcun problema. : D Buona codifica!
Codetard,

Grazie per il passo dopo passo. Questo mi è stato più utile di un semplice blocco di codice.
kenhkelly,

1
"con tutto ciò la tua tastiera inizierà a chiudere toccando al di fuori del campo di testo" - Non è vero. textFieldShouldReturn viene chiamato solo premendo il pulsante Invio.
Jurasic,

39

Swift 4.2 - Nessun delegato necessario

È possibile creare un outlet azioni da UITextField per " Azione primaria innescata " e dimettersi dal primo risponditore sul parametro mittente passato in:

Crea outlet di azione

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

Super semplice.

(Grazie al video di 60 secondi di Scott Smith per avermi dato una mancia su questo: https://youtu.be/v6GrnVQy7iA )


se abbiamo più campi di testo su una pagina, allora dobbiamo farlo per ogni campo di testo ...
DragonFire

@DragonFire È possibile assegnare più campi di testo allo stesso punto vendita. Basta trascinare dalla presa innescata dell'azione primaria nella finestra di ispezione delle prese (lato sinistro dello schermo) all'IBAction nel codice
Brad Root,

È bene notare che il trascinamento diretto dal campo di testo nello storyboard imposterà automaticamente l'azione collegata su Editing Did End, anziché su Azione primaria innescata, quindi dovrebbe essere eseguita dall'Ispettore Connessioni della barra laterale.
Cloud

Sorprendente. Non lo sapevo. Grazie.
Numan Karaaslan,

1
Grazie mille. Questo è esattamente ciò di cui avevo bisogno. Avevo bisogno di eliminare una tastiera dal pulsante di ritorno in una cella di visualizzazione tabella. Funziona perfettamente.
violinista

22

Soluzione Swift 3 semplice: aggiungi questa funzione ai controller della vista che presentano un campo di testo:

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

Quindi apri il tuo editor editor e assicurati che sia Main.storyboard sia da un lato della vista sia il file controller.swift desiderato sia dall'altro. Fai clic su un campo di testo, quindi seleziona dal pannello di utilità sul lato destro la scheda "Mostra Impostazioni di connessione". Controlla il trascinamento da "Did End on Exit" alla funzione sopra nel tuo file rapido. Ripeti l'operazione per qualsiasi altro campo di testo in quella scena e collega alla stessa funzione.


14

@RSC

per me è presente l'aggiunta critica in Xcode Versione 6.2 (6C86e) override func viewDidLoad()

 self.input.delegate = self;

Ho provato a farlo funzionare per ore con la chiave di ritorno finché non ho trovato il tuo post, RSC. Grazie!

Inoltre, se vuoi nascondere la tastiera se tocchi altrove sullo schermo:

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

12

Per ottenere il licenziamento automatico della tastiera, ho inserito questo codice in uno dei metodi della classe del mio campo di testo personalizzato:

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

Sostituisci il nome del tuo punto vendita per textField.


1
Eccezionale. Questa è l'opzione più breve e migliore secondo me. Soprattutto quando si crea un campo di testo all'interno di un altro metodo. Come all'interno di un'intestazione della vista tabella.
kakubei,

Spiacenti, dove devi inserire esattamente questo e cosa devi fare per chiudere la tastiera? Ho inserito mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(versione Swift 5) viewDidLoadma non è tornato né toccato da qualche parte al di fuori del campo di testo. Ho ottenuto i campi di testo creando uno sbocco ciascuno.
Neph,

L'ho inserito in una sottoclasse di una classe personalizzata che eredita da UIViewController. La sottoclasse è inoltre conforme a UITextViewDelegate e UITextFieldDelegate. L'ho messo nel viewDidAppearmetodo di quella classe. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Questo potrebbe essere un po 'troppo specifico per il mio caso, ma si spera che aiuti. Prova a effettuare la chiamata all'interno viewDidAppeare a conformarti a tutti i delegati, se necessario.
peacetype,

10

Un altro modo per farlo che utilizza principalmente lo storyboard e consente facilmente di avere più campi di testo è:

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

Collegare tutti i campi di testo per quel controller di visualizzazione a quell'azione Did End On Exitsull'evento di ciascun campo.


Ci scusiamo per il bernoccolo, ma sto provando questo metodo nella mia app e non sembra funzionare. Ho un campo di testo nella barra di navigazione e l'ho collegato a questa azione con quell'evento come hai detto, ma non funziona in fase di esecuzione.
Wasimsandhu,

Ciò si arresterebbe in modo anomalo se il mittente è di tipo UIBarButtonItem. Se aggiungo la barra degli strumenti con il pulsante Fine al tastierino numerico, il codice è destinato a bloccarsi con un selettore non riconosciuto inviato al registro delle istanze.
Jayprakash Dubey,

8

Vorrei suggerire di iniziare la Classe da 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 l'utente tocca il pulsante Fine sulla tastiera di testo, verrà generato un evento Did End On Exit; in quel momento, dobbiamo dire al campo di testo di rinunciare al controllo in modo che la tastiera scompaia. Per fare ciò, dobbiamo aggiungere un metodo di azione alla nostra classe di controller. Selezionare ViewController.swift aggiungere il seguente metodo di azione:

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

Seleziona Main.storyboard nel Navigatore progetto e visualizza la finestra di ispezione delle connessioni. Trascina dal cerchio accanto a Did End On Exit sull'icona gialla del controller di visualizzazione nello storyboard e lascia andare. Apparirà un piccolo menu a comparsa contenente il nome di una singola azione, quella che abbiamo appena aggiunto. Fai clic sull'azione textFieldDoneEditing per selezionarla e il gioco è fatto.


8

Ecco l'aggiornamento Swift 3.0 al commento del peacetype:

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

questa è una risposta
chiara

Questa dovrebbe essere la risposta accettata. Ha lavorato su un singolo tentativo.
Jaswant Singh,

7

Odio aggiungere la stessa funzione a ogni UIViewController. Estendendo UIViewController per supportare UITextFieldDelegate, è possibile fornire un comportamento predefinito di "Invio premuto".

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

Quando crei un nuovo UIViewController e UITextField, tutto ciò che devi fare è scrivere un codice di linea nel tuo UIViewController.

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

Puoi persino omettere questo codice a una riga agganciando delegato in Main.storyboard. (Usando "ctrl" e trascinare da UITextField a UIViewController)


5

Swift 3

Aggiungi questo codice qui sotto al tuo VC

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

Per me va bene


3

Assicurarsi che il delegato textField sia impostato sul controller di visualizzazione da cui si sta scrivendo il codice relativo al campo di testo.

self.textField.delegate = self

3

veloce

Utilizzando la funzione opzionale da UITextFieldDelegate.

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

falsesignifica che è possibile chiedere a quel campo di dimettersi. true- forzare le dimissioni.


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

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

allora usi questa funzione

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

2

puoi metterlo ovunque ma non in un UIButton

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

quindi puoi inserire questo codice in un pulsante (anche per esempio):

self.view.endEditing(true)

questo ha funzionato per me


2

Nel view controller si sta utilizzando:

//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);
    }

Mi piacciono i tocchiBegan func, funziona in Swift 4 grazie.
AJ Hernandez,

-1

dovresti connettere l'UITextified con un delegato del controller di visualizzazione per chiamare questa funzione


-1

All in One Nascondi tastiera e sposta vista su tastiera Apri: 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
    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.