Einleitung: Warum ist das Abfangen von Textänderungen die Grundlage?
\n\nStellen Sie sich vor: Sie schreiben eine App zum Suchen von Rezepten. Der Benutzer beginnt "Pasta" einzugeben, und Ihre Suche soll sofort auslösen, ohne dass ein Knopf gedrückt werden muss. Oder Sie erstellen ein Registrierungsformular, bei dem der Fehler "Passwort zu kurz" sofort hervorgehoben werden soll, sobald der Benutzer den dritten Buchstaben getippt hat.
\n\nIn beiden Fällen müssen Sie den genauen Zeitpunkt kennen, an dem sich der Text in UITextField geändert hat. Diese Frage auf Stack Overflow hat tausende Aufrufe – und das zu Recht. Jeder iOS-Entwickler stößt früher oder später darauf.
\n\nIm Jahr 2025 haben wir mindestens 4 Möglichkeiten, diese Aufgabe zu lösen. Einige sind alte Hasen, die sich bewährt haben. Andere sind frische Ansätze, die Apple aktiv fördert. In diesem Artikel betrachten wir alle Varianten, von Klassik bis Modern, und ich zeige Ihnen, welche Methode Sie für welche Aufgabe wählen sollten.
\n\nLos geht's! 🚀
\n\nMethode 1. Target-Action: Altbewährt, aber funktioniert
\n\nDie einfachste und verständlichste Methode, die seit iOS 2.0 funktioniert. Ja, sie ist über 15 Jahre alt, aber immer noch aktuell.
\n\nDie Idee ist, dass UITextField von UIControl erbt und daher Ereignisse generieren kann. Uns interessiert das Ereignis .editingChanged – es wird bei jeder Textänderung ausgelöst.
Codebeispiel (UIKit + Storyboard oder per Code)
\n\nimport UIKit\n\nclass ViewController: UIViewController {\n\n @IBOutlet weak var searchTextField: UITextField!\n\n override func viewDidLoad() {\n super.viewDidLoad()\n // Ziel für das Textänderungsereignis hinzufügen\n searchTextField.addTarget(self,\n action: #selector(textFieldDidChange(_:)),\n for: .editingChanged)\n }\n\n @objc func textFieldDidChange(_ textField: UITextField) {\n guard let text = textField.text else { return }\n print("Text geändert: \\(text)")\n // Hier können Sie Suche, Validierung usw. durchführen\n }\n}\n\nVorteile: minimaler Code, keine Protokollkonformität erforderlich, funktioniert schnell.
\nNachteile: Verwendung von @objc – das ist Legacy-Swift. Keine feine Kontrolle (z. B. kann nicht zwischen Texteinfügung und -löschung unterschieden werden).
Methode 2. Delegat UITextFieldDelegate: Kontrolle über jedes Zeichen
\n\nWenn Sie nicht nur wissen müssen, dass sich der Text geändert hat, sondern die Änderung beeinflussen möchten (Eingabe blockieren, Telefonnummer formatieren), dann ist der Delegat Ihre Wahl.
\n\nDie Schlüsselmethode hier ist textField(_:shouldChangeCharactersIn:replacementString:). Sie wird vor der tatsächlichen Textänderung aufgerufen.
Beispiel: Telefonnummer formatieren
\n\nimport UIKit\n\nclass ViewController: UIViewController, UITextFieldDelegate {\n\n @IBOutlet weak var phoneTextField: UITextField!\n\n override func viewDidLoad() {\n super.viewDidLoad()\n phoneTextField.delegate = self\n }\n\n func textField(_ textField: UITextField,\n shouldChangeCharactersIn range: NSRange,\n replacementString string: String) -> Bool {\n\n // Nur Ziffern erlauben\n let allowedCharacters = CharacterSet.decimalDigits\n let characterSet = CharacterSet(charactersIn: string)\n guard allowedCharacters.isSuperset(of: characterSet) else {\n return false\n }\n\n // Länge auf 10 Zeichen begrenzen\n let currentText = textField.text ?? ""\n guard let stringRange = Range(range, in: currentText) else { return false }\n let updatedText = currentText.replacingCharacters(in: stringRange, with: string)\n return updatedText.count <= 10\n }\n\n // Zusätzlich: den Moment abfangen, wenn der Text bereits geändert wurde\n func textFieldDidChangeSelection(_ textField: UITextField) {\n print("Text aktualisiert: \\(textFi