Instantiate et Present ViewController en Swift : Guide complet avec réponses aux questions fréquentes

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

Instantiate et Present ViewController en Swift : Analyse complète avec exemples et réponses aux questions fréquentes

\n\n

Bonjour, collègues ! Si vous avez déjà été confronté à la tâche de créer et d'afficher programmatiquement un nouvel écran dans une application iOS en Swift, vous vous êtes sûrement demandé : "Comment créer correctement un ViewController à partir d'un Storyboard ?", "Comment transférer des données avant l'affichage ?" et "Quelle est la différence entre Segue et Present manuel ?".

\n\n

Ce sujet est l'un des plus populaires sur Stack Overflow (des milliers de vues !), et ce n'est pas pour rien. À première vue, tout semble simple, mais le diable, comme toujours, se cache dans les détails. Analysons toutes les nuances pour que vous ne confondiez plus jamais instantiate viewController Swift et present viewController Swift.

\n\n

1. Méthode de base : Instantiate depuis le Storyboard

\n\n

Le scénario le plus courant est d'avoir un Storyboard avec un contrôleur auquel est attribué un Storyboard ID. Sans cet identifiant, vous ne pourrez pas créer d'instance du contrôleur programmatiquement.

\n\n

Étape 1 : Configuration du Storyboard ID

\n

Ouvrez le Storyboard, sélectionnez le ViewController souhaité, allez dans l'inspecteur Identity Inspector (icône de carte d'identité) et dans le champ Storyboard ID, saisissez un nom unique, par exemple DetailViewController. Assurez-vous également que la case Use Storyboard ID est cochée.

\n\n

Étape 2 : Code pour instantiate et present

\n

Maintenant, à l'endroit souhaité de votre code (par exemple, lors d'un clic sur un bouton), écrivez :

\n\n
import UIKit\n\nclass MainViewController: UIViewController {\n\n    @IBAction func showDetailTapped(_ sender: UIButton) {\n        // 1. Obtenir une référence au Storyboard\n        let storyboard = UIStoryboard(name: "Main", bundle: nil)\n        \n        // 2. Créer une instance du contrôleur via son Storyboard ID\n        guard let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else {\n            fatalError("Impossible de trouver le contrôleur avec l'ID DetailViewController")\n        }\n        \n        // 3. Afficher le contrôleur de manière modale\n        present(detailVC, animated: true, completion: nil)\n    }\n}
\n\n

C'est un exemple classique d'instantiate viewController Swift. Notez l'utilisation de guard let — c'est une extraction sécurisée qui vous protégera d'un crash de l'application si l'ID a été saisi avec une erreur.

\n\n

2. Present vs Push : Quand utiliser quoi ?

\n\n

Beaucoup de débutants confondent present (affichage modal) et push (poussée dans la pile de navigation). Analysons la différence.

\n\n
    \n
  • Present — c'est un affichage modal. Le contrôleur apparaît depuis le bas (ou avec une autre animation) et n'est pas lié à la pile de navigation. Utilisé pour les écrans temporaires : connexion, alertes, formulaires.
  • \n
  • Push — fonctionne uniquement à l'intérieur d'un UINavigationController. Le contrôleur est "poussé" dans la pile, apparaît à droite (par défaut) et reçoit automatiquement un bouton "Retour". Idéal pour les écrans hiérarchiques : liste -> détails.
  • \n
\n\n

Pour le push, utilisez la méthode navigationController?.pushViewController(_:animated:).

\n\n
// Push (nécessite UINavigationController)\nif let navigationController = navigationController {\n    navigationController.pushViewController(detailVC, animated: true)\n} else {\n    present(detailVC, animated: true, completion: nil) // fallback\n}
\n\n

3. Transfert de données avant Present

\n\n

L'une des questions les plus fréquentes : "Comment transférer des données vers un nouveau ViewController avant qu'il n'apparaisse ?". La réponse est simple : utilisez les propriétés ou les méthodes du contrôleur avant d'appeler present.

\n\n

Exemple avec transfert d'une chaîne

\n

Supposons que DetailViewController ait une propriété :

\n\n
class DetailViewController: UIViewController {\n    var receivedMessage: String = ""\n    \n    ov                

Blogs

Book Recommendations