Cierra el teclado iOS tocando en cualquier lugar usando Swift

Resuelto lagoon asked hace 54 años • 45 respuestas

He estado buscando esto por todas partes pero parece que no puedo encontrarlo. Sé cómo descartar el teclado usando Objective-Cpero no tengo idea de cómo hacerlo usando Swift. ¿Alguien sabe?

lagoon avatar Jan 01 '70 08:01 lagoon
Aceptado
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

Esqarrouth avatar Nov 22 '2014 15:11 Esqarrouth

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 ).

King-Wizard avatar Nov 03 '2014 02:11 King-Wizard

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.

Fahim Parkar avatar Feb 03 '2018 01:02 Fahim Parkar

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á.

Dash avatar Jun 09 '2014 18:06 Dash