J'ai cherché partout mais je n'arrive pas à le trouver. Je sais comment supprimer le clavier en utilisant Objective-C
mais je ne sais pas comment faire cela en utilisant Swift
? Est-ce que quelqu'un sait?
J'ai cherché partout mais je n'arrive pas à le trouver. Je sais comment supprimer le clavier en utilisant Objective-C
mais je ne sais pas comment faire cela en utilisant Swift
? Est-ce que quelqu'un sait?
Réponses:
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)
}
Voici une autre façon d'effectuer cette tâche si vous comptez utiliser cette fonctionnalité en plusieurs 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)
}
}
Maintenant, dans tout UIViewController
, tout ce que vous avez à faire est d'appeler cette fonction:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Cette fonction est incluse en tant que fonction standard dans mon référentiel qui contient de nombreuses extensions Swift utiles comme celle-ci, consultez-la: https://github.com/goktugyil/EZSwiftExtensions
didSelectRowAtIndexPath
.
tap.cancelsTouchesInView = false
. Cela l'a résolu pour moi au moins. J'espère que cela aide quelqu'un
Une réponse à votre question sur la façon de fermer le clavier dans Xcode 6.1 à l'aide de Swift ci-dessous:
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)
}
}
Créez l'extension comme ci-dessous et appelez hideKeyboardWhenTappedAround()
dans votre contrôleur de vue de base.
//
// 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)
}
}
La chose la plus importante à appeler dans votre Base View Controller afin que vous n'ayez pas besoin d'appeler tout le temps dans tous les contrôleurs de vue.
Tu peux appeler
resignFirstResponder()
sur n'importe quelle instance d'un répondeur UIR, comme un UITextField. Si vous l'appelez dans la vue qui provoque actuellement l'affichage du clavier, le clavier disparaîtra.
//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
}
}
pour Swift 3 c'est très simple
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
si vous voulez masquer le clavier en appuyant sur la touche RETOUR
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
mais dans le second cas, vous devrez également passer le délégué de tous les textFields au ViewController dans le Main.Storyboard
unrecognized selector sent to instance
avec ce code.
Swift 3: moyen le plus simple de supprimer le clavier:
//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
}
La réponse de Dash est correcte et préférée. Une approche plus "terre brûlée" est d'appeler view.endEditing(true)
. Cela provoque view
et toutes ses sous-vues resignFirstResponder
. Si vous n'avez pas de référence à la vue que vous souhaitez ignorer, il s'agit d'une solution hacky mais efficace.
Notez que personnellement, je pense que vous devriez avoir une référence à la vue que vous aimeriez voir démissionner en tant que premier répondant.
.endEditing(force: Bool)
est une approche barbare; veuillez ne pas l'utiliser.
swift 5 deux lignes suffisent. Ajoutez à votre viewDidLoad
devrait fonctionner.
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
Si votre geste de toucher a bloqué d'autres touches, ajoutez cette ligne:
tapGesture.cancelsTouchesInView = false
Dans le storyboard:
Swift 3:
Extension avec Selector
comme paramètre pour pouvoir faire des choses supplémentaires dans la fonction de rejet et cancelsTouchesInView
pour éviter la distorsion en touchant d'autres éléments de la vue.
extension UIViewController {
func hideKeyboardOnTap(_ selector: Selector) {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
}
Usage:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}
func dismissKeyboard() {
view.endEditing(true)
// do aditional stuff
}
Utilisez IQKeyboardmanager qui vous aidera à résoudre facilement .....
///////////////////////////////////////////
! [comment désactiver le clavier ..] [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)
}
}
J'ai trouvé que la meilleure solution comprenait la réponse acceptée de @Esqarrouth, avec quelques ajustements:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboardView() {
view.endEditing(true)
}
}
La ligne tap.cancelsTouchesInView = false
était critique: elle garantit que le UITapGestureRecognizer
n'empêche pas d'autres éléments de la vue de recevoir l'interaction de l'utilisateur.
La méthode a dismissKeyboard()
été changée en légèrement moins élégante dismissKeyboardView()
. C'est parce que dans la base de code assez ancienne de mon projet, il y avait de nombreuses fois où il dismissKeyboard()
était déjà utilisé (j'imagine que ce n'est pas rare), provoquant des problèmes de compilation.
Ensuite, comme ci-dessus, ce comportement peut être activé dans des contrôleurs de vue individuels:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Dans Swift 4, ajoutez @objc:
Dans le viewDidLoad:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
Une fonction:
@objc func dismissKeyboard() {
view.endEditing(true)
}
Ajoutez cette extension à votre ViewController:
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)
}
}
Pour développer la réponse d'Esqarrouth , j'utilise toujours ce qui suit pour rejeter le clavier, surtout si la classe dont je supprime le clavier n'a pas de view
propriété et / ou n'est pas une sous-classe deUIView
.
UIApplication.shared.keyWindow?.endEditing(true)
Et, pour plus de commodité, l'extension suivante de la UIApplcation
classe:
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)
}
}
En tant que programmeur débutant, cela peut être déroutant lorsque les gens produisent des réponses plus compétentes et inutiles ... Vous n'avez pas à faire les choses compliquées ci-dessus! ...
Voici l'option la plus simple ... Dans le cas où votre clavier apparaît en réponse au champ de texte - Dans votre fonction d'écran tactile, ajoutez simplement la fonction resignFirstResponder . Comme illustré ci-dessous - le clavier se fermera car le premier répondeur est libéré (en quittant la chaîne de répondeur) ...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
J'ai utilisé IQKeyBoardManagerSwift pour le clavier. C'est facile a utiliser. il suffit d'ajouter le pod 'IQKeyboardManagerSwift'
Importez IQKeyboardManagerSwift et écrivez le code didFinishLaunchingWithOptions
dans AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
En rapide vous pouvez utiliser
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.endEditing(true)
}
Pour Swift3
Enregistrer un identificateur d'événement dans viewDidLoad
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
nous devons ensuite ajouter le geste dans la vue dans le même viewDidLoad.
self.view.addGestureRecognizer(tap)
Ensuite, nous devons initialiser la méthode enregistrée
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
Publication en tant que nouvelle réponse depuis que ma modification de la réponse de @ King-Wizard a été rejetée.
Faites de votre classe un délégué de UITextField et remplacez touchesBegan.
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)
}
}
Vous pouvez également ajouter un outil de reconnaissance des mouvements tactiles pour démissionner du clavier. :RÉ
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")
}
Une autre possibilité consiste à simplement ajouter un gros bouton sans contenu se trouvant sous toutes les vues que vous pourriez avoir besoin de toucher. Donnez-lui une action nommée:
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
Le problème avec un identificateur de geste était pour moi, qu'il a également attrapé toutes les touches que je voulais recevoir par la tableViewCells.
Si vous avez d'autres vues qui devraient également être touchées, vous devez définir
cancelsTouchesInView = false
Comme ça:
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)
}
Essayez ça, ça marche
Pour suivre la recommandation de @ modocache d'éviter d'appeler view.endEditing()
, vous pouvez garder une trace du champ de texte qui est devenu premier répondeur, mais qui est désordonné et sujet aux erreurs.
Une alternative consiste à appeler resignFirstResponder()
tous les champs de texte dans le viewcontroller . Voici un exemple de création d'une collection de tous les champs de texte (qui dans mon cas était de toute façon nécessaire pour le code de validation):
@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]
}
Avec la collection disponible, il est simple d'itérer à travers chacun d'eux:
private func dismissKeyboard()
{
for textField in allTextFields
{
textField.resignFirstResponder()
}
}
Alors maintenant, vous pouvez appeler dismissKeyboard()
votre reconnaissance de gestes (ou là où cela vous convient). L'inconvénient est que vous devez conserver la liste des UITextField
s lorsque vous ajoutez ou supprimez des champs.
Commentaires bienvenus. S'il y a un problème avec l'appel resignFirstResponder()
de contrôles qui ne sont pas les premiers intervenants, ou s'il existe un moyen simple et garanti sans bug de suivre le premier répondant actuel, j'aimerais en entendre parler!