[Swift 5] Traitement pour fermer le clavier sur UITableView

introduction

Quand j'ai placé TextField ou TextView dans la cellule de TableView, j'ai eu un peu de mal à fermer le clavier lorsque j'ai tapé sur la partie autre que celles-ci, donc je le posterai comme un mémorandum.

Environnement d'exploitation

【Xcode】Version 12.0.1 【Swift】Version 5.3

Code d'implémentation

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
        
        //Créer une instance pour la reconnaissance des clics
        let tapGesture = UITapGestureRecognizer(
            target: self,
            action: #selector(dismissKeyboard))
        tapGesture.cancelsTouchesInView = false
        //Ajouter à la vue
        view.addGestureRecognizer(tapGesture)
    }
    //Clavier et processus de fermeture
    @objc public func dismissKeyboard() {
        view.endEditing(true)
    }

}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
        return cell
    }
    
}

class TableViewCell: UITableViewCell {
    
    @IBOutlet weak var textField: UITextField!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        textField.delegate = self
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

}

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

Détails d'implémentation

Tout d'abord, j'ai essayé d'obtenir l'événement tactile avec la fonction suivante préparée par Swift et de fermer le clavier, mais le processus n'a pas été appelé. Il semble que ʻUIScrollView et ʻUITableView ne puissent pas obtenir d'événements tactiles par défaut.

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

La méthode ci-dessus n'a pas fonctionné, donc la solution est d'utiliser ʻUITapGestureRecognizer` pour reconnaître le tap. Changé pour fermer le clavier.

//Créer une instance pour la reconnaissance des clics
let tapGesture = UITapGestureRecognizer(
    target: self,
    action: #selector(dismissKeyboard))
view.addGestureRecognizer(tapGesture)
//Clavier et processus de fermeture
@objc public func dismissKeyboard() {
    view.endEditing(true)
}

ʻSi UITapGestureRecognizerest défini, Tap to other vues ne sera pas reconnu. La raison semble être quecancelsTouchesInView est true` par défaut, et cela peut être résolu en ajoutant le code suivant.

tapGesture.cancelsTouchesInView = false

À mon avis, j'ai rencontré ce problème lors de la mise en œuvre de l'écran d'enregistrement pour l'application d'origine, à l'exception de TextView et TextField, qui sont au point lorsque le clavier est affiché. Je pense que c'est normal de ne pas y toucher.

référence

Recommended Posts

[Swift 5] Traitement pour fermer le clavier sur UITableView
[Swift] Comment modifier dynamiquement la hauteur de la barre d'outils sur le clavier
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
Raccourcissez l'UUID en base64 dans Swift.
[Traitement × Java] Comment utiliser la boucle
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
Comment déboguer le traitement dans le modèle Ruby on Rails avec juste la console
Pré-traitement à afficher sur le navigateur (compilateur)
Migration d'Eclipse vers IntelliJ (en cours)
Connexion SSH au serveur d'applications avec heroku
Double-cliquez pour ouvrir le fichier jar sous Windows
[Java] Mémo sur la façon d'écrire la source
À partir d'iOS 14, il ajuste automatiquement le champ de texte à masquer sur le clavier.
[Ruby on Rails] Comment changer le nom de la colonne
[swift5] Comment exécuter le traitement lorsque tabBar est appuyé
Déployer le projet Spring Boot sur Tomcat dans XAMPP
Installez MySQL 5.6 sur CentOS6 [Comment spécifier la version]
[Swift] Comment obtenir l'ID de document Firebase
Je veux retourner la position de défilement de UITableView!
Je souhaite simplifier la sortie du journal sur Android