[Swift 5] Verarbeitung zum Schließen der Tastatur in UITableView

Einführung

Als ich "TextField" oder "TextView" in die Zelle von "TableView" gestellt habe, hatte ich ein kleines Problem beim Schließen der Tastatur, als ich auf einen anderen Teil als diesen getippt habe, sodass ich ihn als Memorandum veröffentlichen werde.

Betriebsumgebung

【Xcode】Version 12.0.1 【Swift】Version 5.3

Implementierungscode

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
        
        //Erstellen Sie eine Instanz für die Tap-Erkennung
        let tapGesture = UITapGestureRecognizer(
            target: self,
            action: #selector(dismissKeyboard))
        tapGesture.cancelsTouchesInView = false
        //Zur Ansicht hinzufügen
        view.addGestureRecognizer(tapGesture)
    }
    //Tastatur- und Schließvorgang
    @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
    }
}

Implementierungsdetails

Zuerst habe ich versucht, das Touch-Ereignis mit der folgenden von Swift vorbereiteten Funktion abzurufen und die Tastatur zu schließen, aber der Vorgang wurde nicht aufgerufen. Es scheint, dass "UIScrollView" und "UITableView" standardmäßig keine Berührungsereignisse erhalten können.

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

Die obige Methode hat nicht funktioniert, daher besteht die Lösung darin, "UITapGestureRecognizer" zu verwenden, um den Abgriff zu erkennen. Geändert, um die Tastatur zu schließen.

//Erstellen Sie eine Instanz für die Tap-Erkennung
let tapGesture = UITapGestureRecognizer(
    target: self,
    action: #selector(dismissKeyboard))
view.addGestureRecognizer(tapGesture)
//Tastatur- und Schließvorgang
@objc public func dismissKeyboard() {
    view.endEditing(true)
}

Wenn Sie "UITapGestureRecognizer" festlegen, wird das Tippen auf andere Ansichten nicht erkannt. Der Grund scheint zu sein, dass cancelsTouchesInView standardmäßig true ist und durch Hinzufügen des folgenden Codes gelöst werden kann.

tapGesture.cancelsTouchesInView = false

Meiner Meinung nach war dieses Problem bei der Implementierung des Registrierungsbildschirms für die ursprüngliche App aufgetreten, mit Ausnahme von "TextView" und "TextField", die bei Anzeige der Tastatur im Fokus stehen. Ich denke, es ist okay, es nicht zu berühren.

Referenz

Recommended Posts

[Swift 5] Verarbeitung zum Schließen der Tastatur in UITableView
[Swift] So ändern Sie dynamisch die Höhe der Symbolleiste auf der Tastatur
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
Kürzen Sie die UUID in Swift auf base64.
[Verarbeitung × Java] Verwendung der Schleife
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
So debuggen Sie die Verarbeitung im Ruby on Rails-Modell nur mit der Konsole
Vorverarbeitung zur Anzeige im Browser (Compiler)
Migration von Eclipse zu IntelliJ (unterwegs)
SSH-Login beim App-Server mit Heroku
Doppelklicken Sie, um die JAR-Datei unter Windows zu öffnen
[Java] Memo zum Schreiben der Quelle
Ab iOS 14 wird das auf der Tastatur ausgeblendete Textfeld automatisch angepasst.
[Ruby on Rails] So ändern Sie den Spaltennamen
[swift5] So führen Sie die Verarbeitung aus, wenn Sie auf die TabBar tippen
Stellen Sie das Spring Boot-Projekt in XAMPP für Tomcat bereit
Installieren Sie MySQL 5.6 unter CentOS6 [So geben Sie die Version an]
[Swift] So erhalten Sie die Firebase-Dokument-ID
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte die Protokollausgabe unter Android vereinfachen