Fiche 03.05 — Loading, Empty et Error Views réutilisables
Objectif
Comprendre comment créer des vues réutilisables pour afficher un chargement, un état vide ou une erreur dans plusieurs écrans SwiftUI.
1. L’idée à comprendre
Dans une vraie app, beaucoup d’écrans ont les mêmes états :
Au lieu de recoder ces interfaces dans chaque écran, tu peux créer des composants réutilisables :
Cela rend tes écrans plus propres et garde une interface cohérente dans toute l’app.
2. LoadingView simple
Utilisation :
3. LoadingView plein écran
Utilisation :
Cette version est utile quand tout l’écran est en chargement.
4. EmptyStateView
Un état vide explique à l’utilisateur pourquoi il n’y a rien à afficher.
Utilisation :
5. EmptyStateView avec action
Parfois, l’état vide doit proposer une action.
Utilisation :
6. ErrorStateView
Une vue d’erreur doit expliquer le problème et proposer de réessayer si possible.
Utilisation :
7. Exemple avec un écran complet
L’écran reste lisible parce que chaque état complexe est déplacé dans un composant.
8. Exemple avec ViewModel
Vue :
9. Où ranger ces composants ?
Comme ils sont souvent utilisés partout :
Si un état vide est spécifique à une feature, il peut rester dans la feature.
Exemple :
10. Preview
En UIKit (rappel)
En UIKit, tu gérais ces états en montrant/cachant des sous-vues à la main, de façon impérative.
Loading avec un UIActivityIndicatorView :
État vide / erreur : tu créais une vue custom (label + image + bouton) que tu ajoutais et retirais selon l'état, avec un isHidden ou un removeFromSuperview().
Depuis iOS 17, UIViewController expose contentUnavailableConfiguration, qui standardise ces états :
Différence clé de mentalité : en UIKit tu manipules des vues (ajoute, retire, masque) selon un état que tu suis toi-même ; en SwiftUI tu décris quoi afficher pour chaque état et le framework recalcule la vue.
👉 En SwiftUI : ce sont de simples sous-vues (ProgressView, ContentUnavailableView) qu'un switch state choisit de manière déclarative.
11. Points à connaître
Un état vide doit expliquer quoi faire
Pas très utile :
Mieux :
Une erreur doit être compréhensible
Évite d’afficher directement une erreur technique à l’utilisateur.
Pas idéal :
Mieux :
Le retry doit être simple à brancher
Un ErrorStateView doit recevoir une closure :
Comme ça, chaque écran décide quoi relancer.
Résumé
À retenir :
- crée des vues réutilisables pour loading, empty et error ;
- cela évite de répéter le même code dans tous les écrans ;
LoadingViewaffiche un chargement ;EmptyStateViewexplique pourquoi il n’y a rien ;ErrorStateViewaffiche une erreur et peut proposer un retry ;- ces composants vont souvent dans
Shared/Components/States; - un bon état vide ou erreur doit aider l’utilisateur à comprendre quoi faire.