iOS-Tastatur per Berührung schließen: Antipatterns und 3 funktionierende Lösungen in Swift

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum schließt sich die Tastatur nicht von selbst?

\n

Hallo, Entwicklerkollege! Wenn du jemals ein Anmeldeformular, eine Suchleiste oder einen Messenger unter iOS geschrieben hast, bist du sicherlich auf folgende Situation gestoßen: Der Benutzer hat Text eingegeben, aber die Tastatur hängt hartnäckig auf dem Bildschirm. Die "Fertig"-Taste wurde nicht gedrückt, der Benutzer tippt auf eine leere Stelle, aber nichts passiert. Ein Klassiker.

\n\n

Dies ist eines der beliebtesten Themen auf Stack Overflow, wo die Frage "Close iOS Keyboard by touching anywhere using Swift" tausende Aufrufe erhalten hat. Das Problem liegt nicht darin, dass es schwierig zu implementieren wäre. Das Problem ist, dass Anfänger (und nicht nur sie) oft falsche oder "unsaubere" Methoden wählen. Lass uns die Top-3-Fehler analysieren und uns dann drei korrekte, funktionierende Lösungen ansehen.

\n\n

Heute sprechen wir über Swift und UIKit. Wenn du SwiftUI verwendest – schau auch vorbei, die Prinzipien sind ähnlich.

\n\n

Fehler Nr. 1: "TapGesture auf alles und jeden legen"

\n

Der häufigste Fehler – einen UITapGestureRecognizer auf die UIView zu legen, aber zu vergessen, cancelsTouchesInView zu deaktivieren. In der Folge reagieren Buttons und Tabellen nicht mehr auf Berührungen. Der Benutzer tippt auf den "Senden"-Button, aber stattdessen wird die Tastatur geschlossen, nicht das Formular abgeschickt.

\n\n

Beispiel für falschen Code:

\n
override func viewDidLoad() {\n    super.viewDidLoad()\n    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))\n    view.addGestureRecognizer(tap)\n}\n\n@objc func dismissKeyboard() {\n    view.endEditing(true)\n}
\n\n

Auf den ersten Blick – alles okay. Aber in der Praxis, wenn du eine UITableView oder einen UIButton hast, können deren Berührungen von dieser Geste "verschluckt" werden. Besonders auffällig wird das, wenn du eine solche Geste auf eine scrollView legst.

\n\n

Wie man es behebt:

\n

Füge die Zeile tap.cancelsTouchesInView = false hinzu. Dadurch können andere UI-Elemente weiterhin Berührungsereignisse empfangen.

\n\n
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))\ntap.cancelsTouchesInView = false\nview.addGestureRecognizer(tap)
\n\n

Aber selbst das ist keine ideale Lösung, wenn du eine komplexe Oberfläche hast.

\n\n

Fehler Nr. 2: "Tap auf leere Stelle zerstört die Tabelle"

\n

Das zweite häufige Problem – eine falsche Interaktion mit UIScrollView oder UITableView. Wenn du einen UITapGestureRecognizer auf die view legst, die eine Tabelle enthält, kann bei einem Tap auf eine Zelle sowohl die Geste als auch die Methode didSelectRow gleichzeitig ausgelöst werden. Oder, noch schlimmer, die Geste fängt die Berührung ab, und die Zelle wird nicht markiert.

\n\n

Lösung: Verwende UIGestureRecognizerDelegate

\n

Implementiere die Methode gestureRecognizer(_:shouldReceive:) und prüfe, ob der Tap auf ein Textfeld oder ein anderes Element erfolgte. Wenn die Berührung auf ein UITextField oder UITextView fällt – blockiere die Geste nicht.

\n\n
extension ViewController: UIGestureRecognizerDelegate {\n    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {\n        // Berührungen nicht abfangen, wenn sie auf ein Textfeld fallen\n        if touch.view is UITextField || touch.view is UITextView {\n            return false\n        }\n        return true\n    }\n}
\n\n

Jetzt wird die Geste nur bei einem Tap auf leere Bereiche ausgelöst, während Textfelder interaktiv bleiben.

\n\n

Fehler Nr. 3: "Die Rückkehr von der Tastatur vergessen"

\n

Viele Entwickler implementieren das Schließen per Tap, vergessen aber den "Return"-Button (Enter) auf der Tastatur. Der Benutzer könnte "Fertig" drücken und erwarten, dass sich die Tastatur schließt. Wenn das nicht passiert, erhältst du eine negative UX.

\n\n

Wie man es behebt:

\n

Abonniere das Protokoll UITextFieldDelegate und implementiere die Methode textFieldShouldReturn:

\n\n
class View                

Blogs

Buchempfehlungen