Datenübergabe zwischen Bildschirmen in iOS: Vom Anfänger zum Profi
\n\nJeder, der mit der iOS-Entwicklung begonnen hat, ist früher oder später gegen eine Wand gelaufen: "Wie übergebe ich einen String, ein Array oder ein Objekt an einen anderen Bildschirm?". Diese Frage ist so beliebt, dass sie auf Stack Overflow tausende Aufrufe und Dutzende Antwortvarianten gesammelt hat. Und das nicht ohne Grund – die iOS-Architektur ist so aufgebaut, dass jeder Bildschirm (ViewController) sein eigenes Leben führt und Daten zwischen ihnen bewusst übergeben werden müssen.
\n\nIn diesem Artikel werden wir 5 grundlegende Methoden zur Datenübergabe zwischen View Controllern in Swift behandeln. Sie erfahren, wann Sie Segue und wann Delegaten oder Closures verwenden sollten und warum NotificationCenter nicht immer böse ist. Los geht's!
\n\nWarum ist das überhaupt ein Problem?
\niOS verwendet eine strenge MVC-Architektur (Model-View-Controller). Jeder ViewController ist für seinen eigenen Bildschirmbereich verantwortlich und hat keinen direkten Zugriff auf die Daten des benachbarten Controllers. Dies dient der Sicherheit und Modularität, bedeutet aber für den Entwickler, dass Daten explizit von Punkt A nach Punkt B "durchgereicht" werden müssen.
\n\nStellen Sie sich vor: Sie haben eine Liste von Benutzern und möchten beim Tippen auf eine Zelle detaillierte Informationen anzeigen. Sie tippen – ein neuer Bildschirm öffnet sich. Wie übergeben Sie die Benutzer-ID? Hier beginnt die Magie.
\n\nMethode 1: Datenübergabe über Storyboard Segue (am einfachsten)
\nDer direkteste Weg ist die Verwendung von prepare(for:sender:). Sie bereiten die Daten einfach vor der Navigation auf. Ideal für einfache Apps und Prototypen.
// Im Quell-ViewController\noverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n if segue.identifier == "showDetail" {\n guard let destinationVC = segue.destination as? DetailViewController else { return }\n destinationVC.userID = 42 // Zahl übergeben\n destinationVC.userName = "Anna" // String übergeben\n }\n}\n\n// In DetailViewController\nvar userID: Int = 0\nvar userName: String = ""\n\n\nVorteile: Minimaler Code, alles an einem Ort. Nachteile: Starke Bindung an Storyboard, schwer zu testen, leicht in Identifikatoren zu verwechseln.
\n\nMethode 2: Programmgesteuerte Navigation mit Datenübergabe (fortgeschrittenes Niveau)
\nWenn Sie Segues leid sind und alles aus dem Code steuern möchten, verwenden Sie eine direkte Instanz des Controllers.
\n\n// Im Quell-ViewController\nfunc showDetail() {\n let storyboard = UIStoryboard(name: "Main", bundle: nil)\n guard let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailVC") as? DetailViewController else { return }\n \n detailVC.userID = 42\n detailVC.userName = "Anna"\n \n navigationController?.pushViewController(detailVC, animated: true)\n}\n\n\nDiese Methode bietet volle Kontrolle: Sie können Daten aus dem Netzwerk laden, überprüfen und erst dann navigieren. Hervorragend für komplexe Logik.
\n\nMethode 3: Delegaten (Delegate Pattern) – Rückmeldung
\nWas tun, wenn Sie Daten zurück übergeben müssen? Zum Beispiel hat der Benutzer auf dem zweiten Bildschirm ein Datum ausgewählt und wir möchten es an den ersten zurückgeben. Hier kommt der Delegat zur Hilfe.
\n\nSchritt 1: Protokoll erstellen
\nprotocol DatePickerDelegate: AnyObject {\n func didSelectDate(_ date: Date)\n}\n\n\nSchritt 2: Delegaten im untergeordneten Controller hinzufügen
\nclass DatePickerViewController: UIViewController {\n weak var delegate: DatePickerDelegate?\n \n @IBAction func saveButtonTapped(_ sender: UIButton) {\n let selectedDate = datePicker.date\n delegate?.didSelectDate(selectedDate)\n dismiss(animated: true)\n }\n}\n\n\nSchritt 3: Delegaten im übergeordneten Controller implementieren
\nclass MainViewController: UIViewController, DatePickerDelegate {\n func didSelectDate(_ date: Date) {\n print("Datum erhalten: \\(date)")\n // UI aktualisieren\n }\n \n override f