Come nascondere la tastiera quando premo il tasto Invio in un UITextField?


148

Fare clic in un campo di testo per far apparire la tastiera. Come lo nascondo quando l'utente preme il tasto Invio?


13
La cosa bella di Stack Overflow è che MOLTE domande hanno già avuto risposta, specialmente quelle semplici. Pertanto, cerca prima le risposte, prima di chiedere. Vedete, è semplice: stackoverflow.com/search?q=iphone+hide+keyboard
Felixyz

Questa è una sottoclasse di UITextfield che cambia dinamicamente UIReturnKey in base alle condizioni di testo / stringa: github.com/codeinteractiveapps/OBReturnKeyTextField
CodeInteractive

Risposte:


286

Innanzitutto, delegare il file per UITextField

@interface MYLoginViewController () <UITextFieldDelegate>

@end

Quindi aggiungi questo metodo al tuo codice.

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

Aggiungi anche self.textField.delegate = self;


1
Curioso, perché <UITextFieldDelegate> non è necessario? Di solito vedrai un avviso in questo caso.
pixelfreak

7
se si rende delegato il file utilizzando Interface Builder, <UITextFieldDelegate> non è necessario nel file .h ..
Saurabh

1
aggiungere <UITextFieldDelegate> nel file .h e impostare delegate in viewdidload [yourTextField setDelegate: self]; lo completerà!
Umit Kaya,

@Saurabh Cosa c'è di così speciale nello storyboard creato VC?
Paul Brewczynski,

62

Nel viewDidLoaddichiarare:

[yourTextField setDelegate:self];

Quindi, includere la sostituzione del metodo delegato:

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

6
+1 per il setDelegate:promemoria. Sicuramente avevo dimenticato e il codice non funzionava in precedenza.
piperchester,

2
Non dovrebbe essere textField, piuttosto che yourTextField mentre viene passato?
Clive Jefferies,

è un modo di dire che dichiara il delegato del tuo campo di testo
oscar castellon

1
<UITextFieldDelegate> dovrebbe essere nel file .h, altrimenti apparirà un avviso!
Umit Kaya,

22

Prova questo in Swift ,

Passaggio 1: impostare delegato come sé sul propriotextField

textField.delegate = self

Passaggio 2: aggiungi questo UITextFieldDelegate sotto la tua dichiarazione di classe,

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

14

In fretta fai così:
prima di tutto, ViewControllerimplementa questo UITextFieldDelegate Per es.

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

Ora aggiungi un delegato a un TextFieldin cui vuoi chiudere la tastiera quando viewDidLoadsi tocca return in un metodo come sotto o dove lo stai inizializzando. Per es.

override func viewDidLoad() {

    super.viewDidLoad()   
    myTextField.delegate = self
}

Ora aggiungi questo metodo.

func textFieldShouldReturn(textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}

1
Il secondo passaggio non è necessario se si imposta un delegato in IB.
hris.to

Appare (nelle attuali versioni di Swift) dovrebbe esserci un trattino basso prima di "textField:"
Bryce Sandlund,

2

Prova questo,

[textField setDelegate: self];

Quindi, nel metodo delegato textField

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

questa non è la migliore pratica per farlo.
orafaelreis,

ha bisogno di UITextFieldDelegate nella definizione dell'interfaccia.
Alp Altunel,

@AlpAltunel: Grazie per il commento, erano passati 4 anni.
Vineesh TP

1

impostare il metodo delegate UITextFielde over ride textFieldShouldReturn, in quel metodo, basta scrivere due righe seguenti:

[textField resignFirstResponder];
return YES;

questo è tutto. Prima di scrivere un codice non dimenticare di impostare il delegato di a UITextFielde impostare il tipo di chiave Return su "Fatto" dalla finestra delle proprietà (comando + maiusc + I).


1

È possibile connettere "Azione primaria innescata" (fare clic con il tasto destro su UITextField) con un IBAction ed è possibile dimettersi dal primo risponditore (senza delega). Esempio (Swift 4):

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

Modo preferito se si utilizzano storyboard.
lal

1

Swift 4

Set delegato UITextFieldnel controller della vista, field.delegate = selfe quindi:

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

come gestiresti la necessità di "tab" per gli utenti al campo di testo successivo premendo il tasto Invio, fino all'ultimo e poi si dimette? Anche in SwiftUI.
Learn2Code

@ Learn2Code crea un gestore, raccogli campi di testo e catene, l'ultimo attiverà la funzione di finitura.
dimpiax,

1

Se si desidera nascondere la tastiera per un uso particolare della tastiera [self.view resignFirstResponder]; Se si desidera nascondere qualsiasi tastiera dalla visualizzazione, utilizzare[self.view endEditing:true];



0

Ok, penso che per un principiante le cose possano essere un po 'confuse. Penso che la risposta corretta sia un mix di tutto quanto sopra, almeno in Swift4.

Crea un'estensione o usa ViewController in cui desideri utilizzarlo, ma assicurati di implementare UITextFieldDelegate. Per motivi di riusabilità ho trovato più facile usare un'estensione:

extension UIViewController : UITextFieldDelegate {
    ...
}

ma l'alternativa funziona anche:

class MyViewController: UIViewController {
    ...
}

Aggiungi il metodo textFieldShouldReturn (a seconda dell'opzione precedente, nell'estensione o nel ViewController)

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

Nel tuo metodo viewDidLoad, imposta il delegato del campo di testo su sé stesso

@IBOutlet weak var myTextField: UITextField!
...

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

Questo dovrebbe essere tutto. Ora, quando si preme returnil textFieldShouldReturndovrebbero essere chiamati.


0

Definire questa classe e quindi impostare il campo di testo per utilizzare la classe e questo automatizza l'intera tastiera nascosta quando si preme return 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
    }

}

Quindi tutto ciò che devi fare nello storyboard è impostare i campi per usare la classe:

inserisci qui la descrizione dell'immagine

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.