Cierra el teclado iOS tocando en cualquier lugar usando Swift
He estado buscando esto por todas partes pero parece que no puedo encontrarlo. Sé cómo descartar el teclado usando Objective-C
pero no tengo idea de cómo hacerlo usando Swift
. ¿Alguien sabe?
override func viewDidLoad() {
super.viewDidLoad()
//Looks for single or multiple taps.
let tap = UITapGestureRecognizer(target: self, action: #selector(UIInputViewController.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)
}
Aquí hay otra forma de realizar esta tarea si va a utilizar esta funcionalidad en varios UIViewControllers
:
// Put this piece of code anywhere you like
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
Ahora en cada UIViewController
, todo lo que tienes que hacer es llamar a esta función:
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Esta función está incluida como una función estándar en mi repositorio que contiene muchas extensiones Swift útiles como esta, échale un vistazo: https://github.com/goktugyil/EZSwiftExtensions
Una respuesta a su pregunta sobre cómo descartar el teclado en Xcode 6.1 usando Swift a continuación:
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)
}
}
( Fuente de esta información ).
Swift 4 funcionando
Cree la extensión como se muestra a continuación y llame hideKeyboardWhenTappedAround()
a su controlador de vista 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)
}
}
Lo más importante es llamar a su controlador de vista base para que no sea necesario llamar todo el tiempo en todos los controladores de vista.
Puedes llamar
resignFirstResponder()
en cualquier instancia de UIResponder, como UITextField. Si lo llama en la vista que actualmente hace que se muestre el teclado, el teclado se cerrará.