Wie verstecke ich die Tastatur schnell, wenn ich die Eingabetaste drücke?

214

Ich benutze, UITextfiedwährend ich auf eine textgesteuerte Tastatur klicke, aber wenn ich die returnTaste gedrückt habe , verschwindet die Tastatur nicht. Ich habe den folgenden Code verwendet:

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

Die Methode resignfirstresponder funktioniert nicht.

Ashwinkumar Mangrulkar
quelle
10
Haben Sie darüber nachgedacht, eine RSC-Antwort zu akzeptieren? Das Akzeptieren von Antworten ist das, was diesen Ort zum Funktionieren bringt und als gute Praxis angesehen wird.
Juan Boero
7
Wenn eine Antwort Ihre Anforderung erfüllt, markieren Sie diese bitte als Antwort, damit andere Personen Hilfe erhalten können.
Syed Md. Kamruzzaman

Antworten:

397

Sie können die App mit der folgenden Funktion dazu bringen, die Tastatur zu schließen

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

Hier ist ein vollständiges Beispiel, um dies besser zu veranschaulichen:

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

Codequelle: http://www.snip2code.com/Snippet/85930/swift-delegate-sample

rsc
quelle
22
Mir fehlte "self.myTextField.delegate = self;" Danke dir!
Tylerlindell
4
Mir hat das gefehlt UITextFieldDelegate!
Cesare
1
@kommradHomer, ohne Zweifel gibt es noch etwas, das Ihre Tastatur nicht anzeigen lässt. Wenn Sie möchten, geben Sie Ihren Code in den Pastebin ein und fügen Sie den Link hier ein, damit ich ihn sehen kann.
rsc
1
@ RSC Sie hatten höchstwahrscheinlich Recht. Ich bin ein 2-Tage-Neuling auf iOS, also irgendwie mein Problem losgeworden und alles hat funktioniert, wie Sie vorgeschlagen haben :)
kommradHomer
1
Also arbeite für mich (schnell 3): func textFieldShouldReturn(textField: UITextField) -> Bool {wechsle zu func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg
112

Der return trueTeil davon teilt dem Textfeld nur mit, ob es zurückkehren darf oder nicht.
Sie müssen das Textfeld manuell anweisen, die Tastatur zu schließen (oder was auch immer der Ersthelfer ist), und dies geschieht resignFirstResponder()wie folgt :

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

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}
Mick MacCallum
quelle
2
danke ... in meinem Fall wurde die Methode "resignFirstResponder ()" nicht automatisch und ich dachte, dass sie nicht unterstützt, aber beim manuellen Schreiben funktioniert sie einwandfrei. Danke, dass ich danach suche.
Ashwinkumar Mangrulkar
@AshwinMangrulkar Sie können erwarten, dass in der Beta-Version von Xcode 6 die automatische Vervollständigung behindert sein könnte.
Paul Brewczynski
1
und natürlich ist das Semikolon nach "true" nicht mehr erforderlich
36 By Design
1
Ist es nicht eine Anforderung, der Ihr viewController entspricht UITextFieldDelegate?
Honig
1
anstelle von self.view.endEditing () ist diese Antwort angemessen und der richtige Ansatz
saigen
45
  • In UITextFieldDelegateder Klasse Erklärung:

    class ViewController: UIViewController, UITextFieldDelegate
  • Schließen Sie das an textfieldoder schreiben Sie es programmgesteuert

    @IBOutlet weak var userText: UITextField!
  • Stellen Sie Ihren Ansichts-Controller so ein, wie die in der Ansicht delegierten Textfelder geladen wurden:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • Fügen Sie die folgende Funktion hinzu

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

    Bei alledem wird Ihre Tastatur durch Berühren außerhalb des Textfelds sowie durch Drücken der Eingabetaste geschlossen.

Codetard
quelle
Danke, Mann! Mir hat das gefehlt: UITextFieldDelegate... vielen Dank!
Adriano Tadao
Aus irgendeinem Grund kann ich, wenn ich txtField.delegate = self setze, nicht in dieses Textfeld eingeben, sobald ich die App ausgeführt habe
Jesus Rodriguez
@JesusAdolfoRodriguez Es muss einen Grund für diesen Fehler geben, obwohl dieser Code kein Problem verursacht. : D Viel Spaß beim Codieren!
Codetard
Vielen Dank für die Schritt für Schritt. Dies war für mich hilfreicher als nur ein Codeblock.
Kenhkelly
1
"Bei alledem wird Ihre Tastatur durch Berühren außerhalb des Textfelds geschlossen" - Nicht wahr. textFieldShouldReturn wird nur beim Drücken der Return-Taste aufgerufen.
Jurasic
38

Swift 4.2 - Kein Delegierter erforderlich

Sie können aus dem UITextField einen Aktionsausgang für die " Ausgelöste primäre Aktion " erstellen und den Ersthelfer für den übergebenen Absenderparameter zurücktreten:

Aktions-Outlet erstellen

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

Super einfach.

(Vielen Dank an Scott Smiths 60-Sekunden-Video, das mich darauf hingewiesen hat: https://youtu.be/v6GrnVQy7iA )

Mark Moeykens
quelle
Wenn wir mehrere Textfelder auf einer Seite haben, müssen wir dies für jedes Textfeld tun ...
DragonFire
@DragonFire Sie können demselben Ausgang mehrere Textfelder zuweisen. Ziehen Sie einfach von der durch die primäre Aktion ausgelösten Steckdose im Steckdoseninspektor (linke Seite des Bildschirms) zur IBAction in Ihrem Code
Brad Root,
Es ist gut zu beachten, dass beim Ziehen direkt aus dem Textfeld im Storyboard die verknüpfte Aktion standardmäßig auf "Edit Did End" anstatt auf "Ausgelöste primäre Aktion" gesetzt wird. Dies sollte daher über den Verbindungsinspektor der Seitenleiste erfolgen.
Wolke
Tolle. Ich wusste das nicht. Vielen Dank.
Numan Karaaslan
Funktioniert auch mit Swift 2, wenn es noch jemanden interessiert. Vielen Dank.
siralexsir88
22

Simple Swift 3 Lösung: Fügen Sie diese Funktion Ihren Ansichtscontrollern hinzu, die über ein Textfeld verfügen:

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

Öffnen Sie dann Ihren Assistenten-Editor und stellen Sie sicher, dass sich sowohl Ihr Main.storyboard auf der einen Seite Ihrer Ansicht als auch die gewünschte Datei view controller.swift auf der anderen Seite befindet. Klicken Sie auf ein Textfeld und wählen Sie dann im rechten Dienstprogrammfenster die Registerkarte "Verbindungsinspektor anzeigen" aus. Steuern Sie das Ziehen von "Did End on Exit" auf die obige Funktion in Ihrer Swift-Datei. Wiederholen Sie diesen Vorgang für jedes andere Textfeld in dieser Szene und verknüpfen Sie ihn mit derselben Funktion.

Elarcoiris
quelle
14

@ RSC

Für mich ist die kritische Ergänzung in Xcode Version 6.2 (6C86e) in override func viewDidLoad()

 self.input.delegate = self;

Ich habe versucht, es stundenlang mit der Eingabetaste zum Laufen zu bringen, bis ich Ihren Beitrag gefunden habe, RSC. Danke dir!

Wenn Sie die Tastatur ausblenden möchten, wenn Sie eine andere Stelle auf dem Bildschirm berühren:

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

Um eine automatische Tastaturentlassung zu erhalten, habe ich diesen Code in eine der Methoden der Klasse meines benutzerdefinierten Textfelds eingefügt:

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

Ersetzen Sie den Namen Ihrer Verkaufsstelle durch textField.

Friedenstyp
quelle
1
Hervorragend. Dies ist meiner Meinung nach die kürzeste und beste Option. Insbesondere, wenn Sie ein Textfeld in einer anderen Methode erstellen. Wie in einer Tabellenansicht.
Kakubei
Entschuldigung, wo genau müssen Sie das platzieren und was müssen Sie tun, damit es die Tastatur schließt? Ich habe mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(Swift 5-Version) viewDidLoadeingegeben, aber weder zurückgegeben noch irgendwo außerhalb des Textfelds getippt hat funktioniert. Ich habe die Textfelder erhalten, indem ich jeweils eine Steckdose erstellt habe.
Neph
Ich habe es in eine Unterklasse einer benutzerdefinierten Klasse eingefügt, die von UIViewController erbt. Die Unterklasse entspricht auch UITextViewDelegate und UITextFieldDelegate. Ich habe es in die viewDidAppearMethode dieser Klasse eingefügt. UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })Dies mag für meinen Fall etwas zu spezifisch sein, aber hoffentlich hilft es. Versuchen Sie, den Anruf innerhalb zu viewDidAppeartätigen und gegebenenfalls den Delegierten zu entsprechen.
Friedenstyp
10

Eine andere Möglichkeit, die meistens das Storyboard verwendet und es Ihnen leicht macht, mehrere Textfelder zu haben, ist:

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

Verbinden Sie alle Ihre Textfelder für diesen Ansichtscontroller mit dieser Aktion für das Did End On ExitEreignis jedes Felds.

James Thompson
quelle
Entschuldigung für die Beule, aber ich versuche diese Methode in meiner App und sie scheint nicht zu funktionieren. Ich habe ein Textfeld in der Navigationsleiste und habe es mit dieser Aktion mit diesem Ereignis verbunden, wie Sie sagten, aber es funktioniert zur Laufzeit nicht.
Wasimsandhu
Dies würde abstürzen, wenn der Absender vom Typ UIBarButtonItem ist. Wenn ich dem Ziffernblock eine Symbolleiste mit der Schaltfläche Fertig hinzufüge, stürzt Ihr Code mit dem nicht erkannten Selektor ab, der an das Instanzprotokoll gesendet wird.
Jayprakash Dubey
8

Ich würde vorschlagen, die Klasse von RSC zu initiieren:

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

}}

LAOMUSISCHE KÜNSTE
quelle
8

Wenn der Benutzer auf der Texttastatur auf die Schaltfläche Fertig tippt, wird ein Ereignis zum Beenden beim Beenden generiert. Zu diesem Zeitpunkt müssen wir das Textfeld anweisen, die Kontrolle aufzugeben, damit die Tastatur verschwindet. Dazu müssen wir unserer Controller-Klasse eine Aktionsmethode hinzufügen. Wählen Sie ViewController.swift und fügen Sie die folgende Aktionsmethode hinzu:

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

Wählen Sie im Projektnavigator Main.storyboard aus und rufen Sie den Verbindungsinspektor auf. Ziehen Sie aus dem Kreis neben Did End On Exit auf das gelbe View Controller-Symbol im Storyboard und lassen Sie los. Ein kleines Popup-Menü mit dem Namen einer einzelnen Aktion wird angezeigt, die wir gerade hinzugefügt haben. Klicken Sie auf die Aktion textFieldDoneEditing, um sie auszuwählen, und fertig.

Ian Seth Colin
quelle
8

Hier ist das Swift 3.0-Update für den Kommentar von peacetype:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)
Darth Flyeater
quelle
Dies ist eine saubere Antwort
Po5i
Dies sollte die akzeptierte Antwort sein. Arbeitete an einem einzigen Versuch.
Jaswant Singh
7

Ich hasse es, jedem UIViewController die gleiche Funktion hinzuzufügen. Durch Erweitern von UIViewController zur Unterstützung von UITextFieldDelegate können Sie das Standardverhalten "Return Pressed" angeben.

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

Wenn Sie einen neuen UIViewController und UITextField erstellen, müssen Sie lediglich einen Zeilencode in Ihren UIViewController schreiben.

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

Sie können diesen einzeiligen Code sogar weglassen, indem Sie den Delegaten in Main.storyboard einbinden. (Verwenden Sie "Strg" und ziehen Sie von UITextField zu UIViewController.)

Wu Yuan Chun
quelle
5

Swift 3

Fügen Sie diesen Code unten Ihrem VC hinzu

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

Funktioniert bei mir

Gilad Brunfman
quelle
3

Stellen Sie sicher, dass Ihr textField-Delegat auf den Ansichtscontroller eingestellt ist, in den Sie Ihren Textfeldcode schreiben.

self.textField.delegate = self
Miladinho
quelle
3

Schnell

Verwenden der optionalen Funktion von UITextFieldDelegate.

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

falsebedeutet, dass das Feld zum Rücktritt aufgefordert werden kann. true- Rücktritt erzwingen.

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

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

dann benutzt du diese Funktion

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
Santi RibeiroO
quelle
2

Sie können dies überall platzieren, aber nicht in einem UIButton

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

dann können Sie diesen Code in eine Schaltfläche einfügen (auch zum Beispiel):

self.view.endEditing(true)

das hat bei mir funktioniert

Blake Scott
quelle
2

In dem Ansichts-Controller, den Sie verwenden:

//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);
    }
Kanishk Verma
quelle
Ich mag die TouchBegan-Funktion, funktioniert in Swift 4, danke.
AJ Hernandez
-1

Sie sollten die UITextfied mit einem Delegaten des View Controllers verbinden, damit diese Funktion aufgerufen wird

Abdulrahman Masoud
quelle
-1

All in One Hide Keyboard und Move View on Keyboard Open: 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
    }

}
Imran Rasheed
quelle