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.
【Xcode】Version 12.0.1 【Swift】Version 5.3
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
}
}
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 que
cancelsTouchesInView 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.
Recommended Posts