Schließen Sie die iOS-Tastatur, indem Sie mit Swift eine beliebige Stelle berühren


408

Ich habe überall danach gesucht, aber ich kann es nicht finden. Ich weiß, wie man die Tastatur mit schließt, Objective-Caber ich habe keine Ahnung, wie ich das machen soll Swift? Weiß jemand?


9
Wie machst du das in Objective-C? Es ist normalerweise eine Konvertierung von einer Syntax in die andere und selten eine Frage unterschiedlicher Methoden / Konventionen.
Craig Otis

5
Ich habe mich nicht mit Swift beschäftigt, aber ich hatte den Eindruck, dass die API dieselbe ist…
Coreyward

Vielleicht möchten Sie diese Antwort überprüfen .
Ahmad F

Antworten:


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

    //Looks for single or multiple taps. 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")

    //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
    //tap.cancelsTouchesInView = false 

    view.addGestureRecognizer(tap)
}

//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

Hier ist eine andere Möglichkeit, diese Aufgabe auszuführen, wenn Sie diese Funktionalität in mehreren Funktionen verwenden möchten UIViewControllers:

// Put this piece of code anywhere you like
extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false            
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

Jetzt müssen UIViewControllerSie nur noch diese Funktion aufrufen:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround() 
}

Diese Funktion ist als Standardfunktion in meinem Repo enthalten, das viele nützliche Swift-Erweiterungen wie diese enthält. Schauen Sie sich das an: https://github.com/goktugyil/EZSwiftExtensions


19
Da Swift 2 in der ersten Antwort, ersetzen diese line-> lassen Hahn: UITapGestureRecognizer = UITapGestureRecognizer (Ziel: Selbst, Aktion: #selector (MyViewController.dismissKeyboard))
Sam Bellerose

2
es bricht die
Sicht von tableviewcell

11
Dies ist eine der hilfreichsten Erweiterungen, die mir je begegnet sind! Vielen Dank! Die einzige Vorsicht, die ich ausdrücken möchte, ist, dass dies stören kann didSelectRowAtIndexPath.
Clifton Labrum

47
Habe gerade diese Frage entdeckt und diese Methode implementiert. Das Ding mit "didSelectRow" von tableView / UICollectionView, das nicht buchstäblich anrief, machte mich verrückt. Die Lösung lautet: Fügen Sie dies einfach zu Ihrer Erweiterung hinzu : tap.cancelsTouchesInView = false. Das hat es zumindest für mich gelöst. Hoffe das hilft jemandem
Quantm

10
"Check out my repo" ist das neue "Hears my new mixtape": P
Josh

118

Eine Antwort auf Ihre Frage, wie Sie die Tastatur in Xcode 6.1 mit Swift unten schließen können:

import UIKit

class ItemViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textFieldItemName: UITextField!

    @IBOutlet var textFieldQt: UITextField!

    @IBOutlet var textFieldMoreInfo: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        textFieldItemName.delegate = self
        textFieldQt.delegate = self
        textFieldMoreInfo.delegate = self
    }

                       ...

    /**
     * Called when 'return' key pressed. return NO to ignore.
     */
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }


   /**
    * Called when the user click on the view (outside the UITextField).
    */
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }

}

( Quelle dieser Informationen ).


6
Toller Code, danke! touchBegan war genau das, wonach ich gesucht habe :)
Lukasz Czerwinski

4
Das hat bei mir nicht ganz funktioniert. Wenn ich auf die Ansicht des View Controllers tippe, funktioniert es. Wenn ich in der Ansicht auf ein Steuerelement tippe, wird die Tastatur nicht geschlossen.
user3731622

Dies ist die beste Antwort, die ich bisher verwendet habe! Diese Antwort sollte als richtig markiert werden. Danke, Mann!
wagng

Dies ist die beste Lösung, die ich bisher gesehen habe. Kleiner Hinweis: In neuerem Swift hat sich die Override-Signatur etwas geändert. Sie müssen _ vor Berührungen hinzufügen: func touchBegan überschreiben (_ Berührungen: <UITouch> setzen, mit Ereignis Ereignis: UIEvent?)
Regis St-Gelais

1
Dieser sollte wahrscheinlich als richtig markiert sein. Durch die aktuell akzeptierte Antwort reagiert jede Schaltfläche in der Ansicht nicht, wenn die Tastatur angezeigt wird.
Bartek Spitza

39

Swift 4 funktioniert

Erstellen Sie eine Erweiterung wie unten und rufen Sie hideKeyboardWhenTappedAround()Ihren Base View Controller auf.

//
//  UIViewController+Extension.swift
//  Project Name
//
//  Created by ABC on 2/3/18.
//  Copyright © 2018 ABC. All rights reserved.
//

import UIKit

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tapGesture = UITapGestureRecognizer(target: self, 
                         action: #selector(hideKeyboard))
        view.addGestureRecognizer(tapGesture)
    }

    @objc func hideKeyboard() {
        view.endEditing(true)
    }
}

Das Wichtigste, was Sie in Ihrem Base View Controller aufrufen müssen, damit Sie nicht in allen View Controllern ständig anrufen müssen.


36

Du kannst anrufen

resignFirstResponder()

auf jeder Instanz eines UIResponders, z. B. eines UITextField. Wenn Sie es in der Ansicht aufrufen, in der die Tastatur gerade angezeigt wird, wird die Tastatur geschlossen.


5
In einer Situation, in der Sie den Ersthelfer nicht genau kennen, kann resignFirstResponder () zu einer Menge Ärger führen. Esqs Antwort unten (mit view.doneEditing ()) ist viel passender
shiser

1
Immer wenn ich resignFirstResponder für mein textField verwende, stürzt die App ab. Ich versuchte alles, was mir einfiel, und sah mich im Internet nach einer Lösung um. Nichts hilft mir. Würdest du zufällig wissen, warum das passiert?
AugustoQ

1
Wie Shiser sagte, ist dies nicht die beste Lösung. Außerdem funktioniert es nicht in allen Situationen.
Alix

21
//Simple exercise to demonstrate, assuming the view controller has a //Textfield, Button and a Label. And that the label should display the //userinputs when button clicked. And if you want the keyboard to disappear //when clicken anywhere on the screen + upon clicking Return key in the //keyboard. Dont forget to add "UITextFieldDelegate" and 
//"self.userInput.delegate = self" as below

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    @IBOutlet weak var userInput: UITextField!
    @IBAction func transferBtn(sender: AnyObject) {
                display.text = userInput.text

    }
    @IBOutlet weak var display: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

//This is important for the textFieldShouldReturn function, conforming to textfieldDelegate and setting it to self
        self.userInput.delegate = self
    }

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

//This is for the keyboard to GO AWAYY !! when user clicks anywhere on the view
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }


//This is for the keyboard to GO AWAYY !! when user clicks "Return" key  on the keyboard

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

}

touchBegan hat für mich gearbeitet, um die Bearbeitung von Textfeld und Textansicht zu beenden. Vielen Dank
Sanju

Das ist was ich benutze, einfach. Entfernen Sie auch die nicht verwandten Codes, um sich auf die Lösung zu konzentrieren.
John Doe

19

für Swift 3 ist es sehr einfach

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

Wenn Sie die Tastatur beim Drücken der RETURN-Taste ausblenden möchten

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

Im zweiten Fall müssen Sie jedoch auch den Delegaten aus allen textFields an den ViewController im Main.Storyboard übergeben


Ich bekomme unrecognized selector sent to instancemit diesem Code.
Haring10

11

Swift 3: Einfachste Möglichkeit, die Tastatur zu schließen:

  //Dismiss keyboard method
    func keyboardDismiss() {
        textField.resignFirstResponder()
    }

    //ADD Gesture Recignizer to Dismiss keyboard then view tapped
    @IBAction func viewTapped(_ sender: AnyObject) {
        keyboardDismiss()
    }

    //Dismiss keyboard using Return Key (Done) Button
    //Do not forgot to add protocol UITextFieldDelegate 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        keyboardDismiss()

        return true
    }

1
Ich bin mir ziemlich sicher, dass der Aufruf von view.endEditing (true) einfacher ist, da Sie keine Variable speichern müssen oder davon ausgehen müssen, dass Sie nur ein Textfeld haben.
Glenn Howes

10

Die Antwort von Dash ist richtig und bevorzugt. Ein eher "verbrannter Erde" -Ansatz ist zu nennen view.endEditing(true). Dies verursacht viewund alle seine Unteransichten zu resignFirstResponder. Wenn Sie keinen Verweis auf die Ansicht haben, die Sie verwerfen möchten, ist dies eine hackige, aber effektive Lösung.

Beachten Sie, dass ich persönlich denke, Sie sollten einen Verweis auf die Ansicht haben, die Sie als Ersthelfer zurücktreten möchten. .endEditing(force: Bool)ist ein barbarischer Ansatz; Bitte benutze es nicht.


10

schnelle 5 nur zwei Zeilen sind genug. Fügen Sie in Ihre viewDidLoadsollte Arbeit.

 let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
 view.addGestureRecognizer(tapGesture)

Wenn Ihre Tippgeste andere Berührungen blockiert hat, fügen Sie diese Zeile hinzu:

tapGesture.cancelsTouchesInView = false

Sehr einfache und elegante Lösung :), sollte hier die Antwort sein.
Joseph Astrahan

9

Im Storyboard:

  1. Wählen Sie die Tabellenansicht
  2. Wählen Sie auf der rechten Seite den Attributinspektor aus
  3. Wählen Sie im Tastaturbereich den gewünschten Entlassungsmodus aus

kann diesen Gegenstand nicht finden, wo ist er und wie sieht er aus? Ich bin im Attributinspektor eines Textfeldes
Ethan Parker

Sie müssen sich die TableView nicht TextField ansehen
zevij

9

Swift 3:

Erweiterung mit Selectorals Parameter, um zusätzliche Funktionen in der Entlassungsfunktion ausführen zu können und cancelsTouchesInViewVerzerrungen durch Berühren anderer Elemente der Ansicht zu vermeiden.

extension UIViewController {
    func hideKeyboardOnTap(_ selector: Selector) {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
}

Verwendungszweck:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}

func dismissKeyboard() {
    view.endEditing(true)
    // do aditional stuff
}

9

Verwenden Sie IQKeyboardmanager , der Ihnen bei der Lösung hilft .....

////////////////////////////////////////////////

! [wie man die Tastatur deaktiviert ..] [1]

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

   @IBOutlet weak var username: UITextField!
   @IBOutlet weak var password: UITextField!

   override func viewDidLoad() {
      super.viewDidLoad() 
      username.delegate = self
      password.delegate = self
      // Do any additional setup after loading the view, typically from a nib.
   }

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

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

   override func touchesBegan(_: Set<UITouch>, with: UIEvent?) {
     username.resignFirstResponder()
     password.resignFirstResponder()
     self.view.endEditing(true)
  }
}

8

Ich fand, dass die beste Lösung die akzeptierte Antwort von @Esqarrouth mit einigen Anpassungen enthielt:

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    func dismissKeyboardView() {
        view.endEditing(true)
    }
}

Die Zeile tap.cancelsTouchesInView = falsewar kritisch: Sie stellt sicher, UITapGestureRecognizerdass andere Elemente in der Ansicht nicht daran gehindert werden, Benutzerinteraktionen zu empfangen.

Die Methode dismissKeyboard()wurde auf die etwas weniger elegante geändert dismissKeyboardView(). Dies liegt daran, dass in der ziemlich alten Codebasis meines Projekts dismissKeyboard()bereits zahlreiche Male verwendet wurden (ich stelle mir vor, dass dies nicht ungewöhnlich ist), was zu Compilerproblemen führte.

Dann kann dieses Verhalten wie oben in einzelnen View Controllern aktiviert werden:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround() 
}

7

Wenn Sie eine Bildlaufansicht verwenden, kann dies viel einfacher sein.

Einfach Dismiss interactivelyim Storyboard auswählen .


7

Fügen Sie in Swift 4 @objc hinzu:

In der viewDidLoad:

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

Funktion:

@objc func dismissKeyboard() {
  view.endEditing(true)
}

7

Fügen Sie diese Erweiterung Ihrem ViewController hinzu:

  extension UIViewController {
// Ends editing view when touches to view 
  open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    self.view.endEditing(true)
  }
}

6

Um die Antwort von Esqarrouth zu erweitern , verwende ich immer Folgendes, um die Tastatur zu schließen, insbesondere wenn die Klasse, aus der ich die Tastatur entlasse, keine viewEigenschaft hat und / oder keine Unterklasse von istUIView .

UIApplication.shared.keyWindow?.endEditing(true)

Und der Einfachheit halber die folgende Erweiterung der UIApplcationKlasse:

extension UIApplication {

    /// Dismisses the keyboard from the key window of the
    /// shared application instance.
    ///
    /// - Parameters:
    ///     - force: specify `true` to force first responder to resign.
    open class func endEditing(_ force: Bool = false) {
        shared.endEditing(force)
    }

    /// Dismisses the keyboard from the key window of this 
    /// application instance.
    ///
    /// - Parameters:
    ///     - force: specify `true` to force first responder to resign.
    open func endEditing(_ force: Bool = false) {
        keyWindow?.endEditing(force)
    }

}

5
  import UIKit

  class ItemViewController: UIViewController, UITextFieldDelegate {

  @IBOutlet weak var nameTextField: UITextField!

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

    // Called when 'return' key pressed. return NO to ignore.

    func textFieldShouldReturn(textField: UITextField) -> Bool {

            textField.resignFirstResponder()
             return true
     }

 // Called when the user click on the view (outside the UITextField).

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

5

Als unerfahrener Programmierer kann es verwirrend sein, wenn Leute kompetentere und unnötigere Antworten liefern ... Sie müssen keine der oben gezeigten komplizierten Dinge tun! ...

Hier ist die einfachste Option ... Falls Ihre Tastatur als Reaktion auf das Textfeld angezeigt wird - Fügen Sie in Ihrer Touchscreen-Funktion einfach die Funktion resignFirstResponder hinzu . Wie unten gezeigt, wird die Tastatur geschlossen, da der First Responder freigegeben wird (Verlassen der Responder-Kette) ...

override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
    MyTextField.resignFirstResponder()
}

5

Ich habe IQKeyBoardManagerSwift für die Tastatur verwendet. es ist einfach zu bedienen. Fügen Sie einfach den Pod 'IQKeyboardManagerSwift' hinzu.

Importieren Sie IQKeyboardManagerSwift und schreiben Sie Code didFinishLaunchingWithOptionsin AppDelegate.

///add this line 
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true

4

Dieser eine Liner tritt die Tastatur von allen (beliebigen) UITextField in einer UIView zurück

self.view.endEditing(true)

4

Nur eine Codezeile in der viewDidLoad()Methode:

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))

4

In schneller können Sie verwenden

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

}

3

Für Swift3

Registrieren Sie einen Ereigniserkenner in viewDidLoad

let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))

Dann müssen wir die Geste in derselben viewDidLoad zur Ansicht hinzufügen.

self.view.addGestureRecognizer(tap)

Dann müssen wir die registrierte Methode initialisieren

func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
    view.endEditing(true)
}

1
Vielen Dank für die vollständige Antwort und mit Notizen. Dies ist die einzige Lösung, die für mich funktioniert hat.
Zeeshan

3

Das Posten als neue Antwort, da meine Bearbeitung der Antwort von @ King-Wizard abgelehnt wurde.

Machen Sie Ihre Klasse zu einem Delegaten des UITextField und überschreiben Sie touchBegan.

Swift 4

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField!

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

    //Called when 'return' key is pressed. Return false to keep the keyboard visible.
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        return true
    }

    // Called when the user clicks on the view (outside of UITextField).
    override func touchesBegan(touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

}

2

Sie können auch eine Tippgestenerkennung hinzufügen, um die Tastatur zu verlassen. : D.

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

    let recognizer = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    backgroundView.addGestureRecognizer(recognizer)
}
    func handleTap(recognizer: UITapGestureRecognizer) {
    textField.resignFirstResponder()
    textFieldtwo.resignFirstResponder()
    textFieldthree.resignFirstResponder()

    println("tappped")
}

2

Eine andere Möglichkeit besteht darin, einfach eine große Schaltfläche ohne Inhalt hinzuzufügen, die sich unter allen Ansichten befindet, die Sie möglicherweise berühren müssen. Geben Sie ihm eine Aktion mit dem Namen:

@IBAction func dismissKeyboardButton(sender: AnyObject) {
    view.endEditing(true)
}

Das Problem mit einem Gestenerkenner war für mich, dass er auch alle Berührungen erfasste, die ich von den tableViewCells erhalten wollte.


2

Wenn Sie andere Ansichten haben, die ebenfalls die Berührung erhalten sollen, müssen Sie festlegen cancelsTouchesInView = false

So was:

let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    elsewhereTap.cancelsTouchesInView = false
    self.view.addGestureRecognizer(elsewhereTap)

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

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))

}

func tap(sender: UITapGestureRecognizer){
        print("tapped")
        view.endEditing(true)
}

Versuchen Sie dies, es funktioniert


1

Wenn die Ansicht mehr als ein Textfeld enthält

Befolgen Sie die Empfehlung von @ modocache , um einen Anruf zu vermeidenview.endEditing() können Sie das Textfeld verfolgen, das zum Ersthelfer wurde, das jedoch unübersichtlich und fehleranfällig ist.

Eine Alternative besteht darin, resignFirstResponder() alle Textfelder im Viewcontroller aufzurufen . Hier ist ein Beispiel für das Erstellen einer Sammlung aller Textfelder (die in meinem Fall ohnehin für den Validierungscode benötigt wurden):

@IBOutlet weak var firstName: UITextField!
@IBOutlet weak var lastName: UITextField!
@IBOutlet weak var email: UITextField!

var allTextFields: Array<UITextField>!  // Forced unwrapping so it must be initialized in viewDidLoad
override func viewDidLoad()
{
    super.viewDidLoad()
    self.allTextFields = [self.firstName, self.lastName, self.email]
}

Mit der verfügbaren Sammlung ist es einfach, alle zu durchlaufen:

private func dismissKeyboard()
{
    for textField in allTextFields
    {
        textField.resignFirstResponder()
    }
}

Jetzt können Sie dismissKeyboard()Ihren Gestenerkenner aufrufen (oder wo immer es für Sie angemessen ist). Nachteil ist, dass Sie die Liste der UITextFields pflegen müssen, wenn Sie Felder hinzufügen oder entfernen.

Kommentare willkommen. Wenn es ein Problem beim Aufrufen resignFirstResponder()von Steuerelementen gibt, die keine Ersthelfer sind, oder wenn es eine einfache und garantierte Möglichkeit gibt, den aktuellen Ersthelfer ohne Fehler zu verfolgen, würde ich gerne davon hören!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.