Ich habe überall danach gesucht, aber ich kann es nicht finden. Ich weiß, wie man die Tastatur mit schließt, Objective-C
aber ich habe keine Ahnung, wie ich das machen soll Swift
? Weiß jemand?
Ich habe überall danach gesucht, aber ich kann es nicht finden. Ich weiß, wie man die Tastatur mit schließt, Objective-C
aber ich habe keine Ahnung, wie ich das machen soll Swift
? Weiß jemand?
Antworten:
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 UIViewController
Sie 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
didSelectRowAtIndexPath
.
tap.cancelsTouchesInView = false
. Das hat es zumindest für mich gelöst. Hoffe das hilft jemandem
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)
}
}
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.
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.
//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
}
}
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
unrecognized selector sent to instance
mit diesem Code.
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
}
Die Antwort von Dash ist richtig und bevorzugt. Ein eher "verbrannter Erde" -Ansatz ist zu nennen view.endEditing(true)
. Dies verursacht view
und 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.
schnelle 5 nur zwei Zeilen sind genug. Fügen Sie in Ihre viewDidLoad
sollte 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
Im Storyboard:
Swift 3:
Erweiterung mit Selector
als Parameter, um zusätzliche Funktionen in der Entlassungsfunktion ausführen zu können und cancelsTouchesInView
Verzerrungen 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
}
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)
}
}
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 = false
war kritisch: Sie stellt sicher, UITapGestureRecognizer
dass 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()
}
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)
}
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)
}
}
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 view
Eigenschaft hat und / oder keine Unterklasse von istUIView
.
UIApplication.shared.keyWindow?.endEditing(true)
Und der Einfachheit halber die folgende Erweiterung der UIApplcation
Klasse:
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)
}
}
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)
}
}
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()
}
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 didFinishLaunchingWithOptions
in AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
In schneller können Sie verwenden
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.endEditing(true)
}
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)
}
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)
}
}
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")
}
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.
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)
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
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 UITextField
s 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!