Transfert de données entre écrans dans iOS : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Transfert de données entre écrans dans iOS : du débutant au pro

\n\n

Quiconque a commencé à développer pour iOS s'est un jour heurté à un mur : "Comment transférer une chaîne, un tableau ou un objet vers un autre écran ?". La question est si populaire que sur Stack Overflow, elle a rassemblé des milliers de vues et des dizaines de réponses. Et ce n'est pas un hasard — l'architecture iOS est conçue de sorte que chaque écran (ViewController) vit sa propre vie, et les données entre eux doivent être transférées de manière réfléchie.

\n\n

Dans cet article, nous allons examiner 5 méthodes principales de transfert de données entre view controllers en Swift. Vous apprendrez quand utiliser segue, et quand utiliser les délégués ou les closures, et pourquoi NotificationCenter n'est pas toujours un mal. C'est parti !

\n\n

Pourquoi est-ce un problème ?

\n

iOS utilise une architecture MVC (Model-View-Controller) stricte. Chaque ViewController est responsable de sa propre partie d'écran et n'a pas d'accès direct aux données du contrôleur voisin. Cela est fait pour la sécurité et la modularité, mais pour le développeur, cela signifie qu'il faut explicitement "transmettre" les données du point A au point B.

\n\n

Imaginez : vous avez une liste d'utilisateurs et vous souhaitez afficher les informations détaillées en appuyant sur une cellule. Vous appuyez — un nouvel écran s'ouvre. Comment transférer l'ID de l'utilisateur ? C'est là que la magie commence.

\n\n

Méthode 1 : Transfert de données via Storyboard Segue (la plus simple)

\n

La méthode la plus directe consiste à utiliser prepare(for:sender:). Vous préparez simplement les données avant la transition. Idéal pour les applications simples et les prototypes.

\n\n
// Dans le ViewController source\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 // transfert d'un nombre\n        destinationVC.userName = "Anna" // transfert d'une chaîne\n    }\n}\n\n// Dans DetailViewController\nvar userID: Int = 0\nvar userName: String = ""\n
\n\n

Avantages : Code minimal, tout au même endroit. Inconvénients : Forte dépendance au Storyboard, difficile à tester, facile de se perdre dans les identifiants.

\n\n

Méthode 2 : Navigation programmatique avec transfert de données (niveau avancé)

\n

Lorsque vous êtes fatigué des segues et que vous voulez tout contrôler depuis le code, utilisez une instance directe du contrôleur.

\n\n
// Dans le ViewController source\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\n

Cette méthode offre un contrôle total : vous pouvez charger des données depuis le réseau, les vérifier, puis seulement effectuer la transition. Excellent pour une logique complexe.

\n\n

Méthode 3 : Délégués (Delegate Pattern) — retour d'information

\n

Que faire si vous devez transférer des données en retour ? Par exemple, l'utilisateur a sélectionné une date sur le deuxième écran, et nous voulons la renvoyer au premier. C'est là qu'intervient le délégué.

\n\n

Étape 1 : Créer un protocole

\n
protocol DatePickerDelegate: AnyObject {\n    func didSelectDate(_ date: Date)\n}\n
\n\n

Étape 2 : Ajouter le délégué dans le contrôleur enfant

\n
class 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\n

Étape 3 : Implémenter le délégué dans le contrôleur parent

\n
class MainViewController: UIViewController, DatePickerDelegate {\n    func didSelectDate(_ date: Date) {\n        print("Date reçue : \\(date)")\n        // mise à jour de l'interface\n    }\n    \n    override f                

Blogs

Book Recommendations