viewWillDisappear est une méthode de UIViewController qu’UIKit appelle juste avant que l’écran ne commence à disparaître de l’affichage de l’utilisateur. Selon la Apple Developer Documentation, cette méthode reçoit un paramètre animated et se déclenche lors de push, pop, present, dismiss et changement d’onglet. viewWillDisappear est l’endroit principal pour sauvegarder l’état et libérer correctement les ressources.
Points clés
viewWillDisappear est une méthode de UIViewController qu’UIKit appelle juste avant que la Vue du contrôleur ne commence à disparaître de l’écran. À ce moment, l’écran est encore visible pour l’utilisateur, mais la transition a déjà été initiée : NavigationController a commencé l’animation push/pop, la vue modale a commencé à se fermer, ou TabBar a commencé à changer d’onglet. Le développeur redéfinit cette méthode pour effectuer des opérations qui nécessitent que l’écran soit encore accessible tout en se préparant à le masquer.
Contrairement à viewDidDisappear, qui se déclenche après que l’écran est masqué, viewWillDisappear offre la dernière opportunité de sauvegarder des données et de libérer des ressources pendant que l’utilisateur peut encore voir l’interface. C’est crucial pour l’UX — la sauvegarde d’un brouillon ou l’arrêt d’un minuteur doit se produire avant que l’utilisateur ne change d’écran.
La méthode accepte un paramètre animated qui indique si la disparition est animée. true signifie qu’UIKit effectue une transition animée, false signifie que l’écran disparaît instantanément, par exemple lors d’un dismiss sans animation ou d’une suppression programmatique de la hiérarchie.
viewWillDisappear est appelé dans tous les scénarios où l’écran actuel cesse d’être actif. Passons en revue les principaux cas spécifiques au développement iOS.
Quand UINavigationController effectue un push d’un nouveau contrôleur, viewWillDisappear est appelé sur le contrôleur actuel au début de l’animation de transition. À ce moment, l’écran actuel est encore visible sous le nouveau contrôleur qui glisse par-dessus. C’est le scénario standard où viewWillDisappear se déclenche avec animated = true.
Quand l’utilisateur appuie sur le bouton retour ou effectue un balayage interactif vers l’arrière, viewWillDisappear est appelé sur le contrôleur actuel. Avec un geste interactif, cet appel peut être annulé si l’utilisateur change d’avis et ramène l’écran à sa place. C’est une caractéristique importante à prendre en compte lors de la conception de la sauvegarde d’état.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
saveDraftData()
NotificationCenter.default.removeObserver(self)
}
Lors de la fermeture d’une vue modale, viewWillDisappear est appelé sur le contrôleur fermé au début de l’animation de dismiss. À ce stade, vous pouvez transmettre les résultats via un délégué ou une closure, car le contrôleur qui a présenté la vue modale n’a pas encore repris le contrôle.
UITabBarController appelle viewWillDisappear sur le contrôleur de l’onglet quitté juste après que l’utilisateur a touché un autre onglet. Si l’onglet actuel a des processus actifs — lecture multimédia, téléchargement de fichier, minuteur — ils doivent être mis en pause ou arrêtés ici.
viewWillDisappear résout des tâches spécifiques de gestion des ressources et de l’état. Passons en revue les scénarios clés avec des exemples de code.
La tâche la plus importante de viewWillDisappear est de sauvegarder les données que l’utilisateur a saisies ou modifiées sur l’écran actuel. Brouillons de messages, champs de formulaire modifiés, paramètres sélectionnés — tout cela doit être sauvegardé avant que l’écran ne disparaisse. Utilisez Core Data, UserDefaults ou le stockage de fichiers pour la persistance.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard hasUnsavedChanges else { return }
draftStorage.save(currentDraft)
}
Les abonnements à NotificationCenter, KVO et aux publishers Combine que vous avez faits dans viewWillAppear ou viewDidLoad doivent être annulés dans viewWillDisappear. Sinon, les notifications arriveront sur l’écran masqué, provoquant des mises à jour de l’interface que l’utilisateur ne voit pas, ou — pire — des plantages dus à l’accès à des objets déjà désalloués.
Les animations UIView lancées dans viewDidAppear et les minuteurs fonctionnant via Timer ou DispatchSource doivent être arrêtés dans viewWillDisappear. Les animations qui continuent sur un écran masqué gaspillent le GPU et la batterie sans aucun bénéfice pour l’utilisateur. Arrêtez-les explicitement en appelant invalidate sur les minuteurs et removeAllAnimations sur les couches.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
countdownTimer?.invalidate()
countdownTimer = nil
loadingIndicator.layer.removeAllAnimations()
}
Si un contrôleur a été ouvert pour obtenir un résultat — sélection d’un élément, saisie de texte, confirmation d’action — viewWillDisappear est le dernier moment où le contrôleur d’origine existe encore dans la pile et peut recevoir des données. Appelez le délégué ou la closure avant que deinit ne soit invoqué.
La sauvegarde fiable de l’état est l’une des tâches les plus difficiles du développement iOS. viewWillDisappear est un élément important mais pas le seul de la stratégie. Examinons une approche globale.
Niveau 1 — sauvegarde dans viewWillDisappear. Sauvegarde rapide des données légères qui doivent être disponibles immédiatement au retour. Convient pour l’état de l’interface : position de défilement, segment sélectionné, texte dans les champs de saisie. Problème : lors d’un geste de pop interactif annulé, la sauvegarde se produit même si l’utilisateur est resté sur l’écran — les données sont écrasées inutilement.
Niveau 2 — sauvegarde dans viewDidDisappear. Duplique la sauvegarde du premier niveau mais ne se déclenche qu’après que l’écran est garanti masqué. C’est une protection contre les gestes annulés. Cependant, si vous vous êtes déjà désabonné des notifications dans viewWillDisappear, viewDidDisappear peut ne pas avoir accès à certaines données.
Niveau 3 — sauvegarde via les notifications d’application. UIApplication.willResignActiveNotification et UIApplication.didEnterBackgroundNotification interceptent la mise en arrière-plan de l’application. Si l’utilisateur a minimisé l’application, viewWillDisappear peut ne pas avoir été appelé — mais la sauvegarde via ces notifications garantit l’intégrité des données à la fin de la session.
| Niveau | Méthode/Notification | Fiabilité | Utilisation |
|---|---|---|---|
| 1 | viewWillDisappear | Élevée | État de l’interface, brouillons |
| 2 | viewDidDisappear | Très élevée | Données critiques |
| 3 | willResignActive | Maximale | Lors de la mise en arrière-plan |
Recommandation : utilisez une combinaison des trois niveaux pour les données critiques de l’utilisateur. Pour l’état non critique, le premier niveau suffit. Il est important de ne pas sauvegarder les mêmes données plusieurs fois — utilisez un indicateur dirty signalant que les données ont changé depuis la dernière sauvegarde.
Une attention particulière doit être accordée à la stratégie pour les écrans CRUD où l’utilisateur saisit des données. Sur ces écrans, il n’est pas recommandé de sauvegarder chaque frappe dans viewWillDisappear — c’est excessif. Utilisez la sauvegarde automatique avec temporisation (debounce) via Timer, et utilisez viewWillDisappear uniquement pour la sauvegarde forcée finale si des modifications non sauvegardées existent. Cette approche équilibre les performances et l’intégrité des données.
Pour les applications utilisant Core Data, une mesure supplémentaire consiste à appeler saveContext dans viewWillDisappear uniquement en cas de modifications réelles dans le contexte d’objets gérés. Vérifier context.hasChanges avant la sauvegarde évite les écritures inutiles dans le stockage persistant et prolonge la durée de vie de la batterie de l’appareil. Combinez cette vérification avec la sauvegarde globale dans applicationDidEnterBackground.
Une utilisation incorrecte de viewWillDisappear peut entraîner une perte de données, des fuites mémoire et un comportement instable de l’application. Passons en revue les erreurs fréquentes des développeurs iOS.
Première erreur — sauvegarder les données uniquement dans viewWillDisappear. Comme discuté précédemment, avec un geste de pop interactif la méthode est appelée même si l’écran n’a pas disparu. Si la sauvegarde a des effets secondaires — envoi de données au serveur, changement d’état — cela peut entraîner des déclenchements erronés. Ajoutez une vérification de isBeingDismissed ou isMovingFromParent.
Deuxième erreur — ne pas se désabonner de NotificationCenter. C’est l’une des fuites mémoire les plus courantes sous iOS. Si vous vous êtes abonné dans viewWillAppear à UIResponder.keyboardWillShowNotification mais ne vous êtes pas désabonné dans viewWillDisappear, la closure continuera à être appelée. Lors du deinit du contrôleur, la closure fera référence à un objet désalloué — plantage de l’application garanti.
Troisième erreur — exécution d’opérations synchrones lourdes. Sauvegarder de grandes quantités de données, écrire dans Core Data ou le système de fichiers dans viewWillDisappear bloque le thread principal. Si l’opération dure plus longtemps que l’animation de transition, UIKit met le thread en pause et l’interface se fige. Déplacez les sauvegardes lourdes vers des files d’attente en arrière-plan.
Quatrième erreur — oublier d’appeler super. Ne pas appeler super.viewWillDisappear peut perturber UINavigationController et UITabBarController, qui utilisent cette méthode pour leurs états internes. Appelez toujours super en premier ou en dernier, conformément à la documentation Apple.
Ce problème est aggravé sous iOS avec le multitâche actif et les changements d’application. Cinquième erreur — utiliser DispatchQueue.main.async après la sauvegarde dans viewWillDisappear. Si vous envoyez de manière asynchrone un bloc à la file principale après avoir appelé super.viewWillDisappear, rien ne garantit que le contrôleur existe encore au moment de l’exécution du bloc. Utilisez toujours des références faibles [weak self] dans les closures pour éviter d’accéder à la mémoire désallouée et prévenir les plantages de l’application.
Foire aux questions
viewWillDisappear est appelé au début de la disparition alors que l’écran est encore visible. viewDidDisappear est appelé après que l’écran est complètement masqué et que l’animation est terminée.
Utilisez viewDidDisappear pour confirmer la sauvegarde ou vérifiez les propriétés isMovingFromParent et isBeingDismissed dans viewWillDisappear pour déterminer si l’écran disparaîtra réellement.
Oui, absolument si vous utilisez des blocs ou sélecteurs avec self. ARC ne gère pas les abonnements NotificationCenter. Sous iOS 9+ pour les blocs, utilisez une référence faible et désabonnez-vous dans viewWillDisappear.
Impossible — le force quit n’appelle pas les méthodes du cycle de vie. Pour une sauvegarde garantie à la fin de l’application, utilisez UIApplication.willTerminateNotification ou sauvegardez les données en temps réel au fur et à mesure de leurs modifications.
Oui, lors d’un geste de pop interactif, UIKit appelle viewWillDisappear juste après le début du geste. Si l’utilisateur annule le geste, l’écran reste visible mais la méthode a déjà été déclenchée. Vérifiez toujours isMovingFromParent.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi