Fiche 02.10 — États d’écran : loading, loaded, empty, error
Objectif
Comprendre comment représenter proprement les différents états d’un écran SwiftUI : chargement, contenu chargé, contenu vide et erreur.
1. L’idée à comprendre
Dans une vraie app, un écran n’affiche pas toujours directement ses données.
Il peut être dans plusieurs états :
Exemple concret : une liste d’utilisateurs.
Au départ, l’app charge les utilisateurs.
Ensuite :
- soit elle affiche la liste ;
- soit elle affiche “Aucun utilisateur” ;
- soit elle affiche une erreur.
SwiftUI est très adapté à cette logique, car l’interface dépend directement de l’état actuel.
2. Version simple avec plusieurs variables
Tu peux commencer avec des variables simples.
Cette approche fonctionne pour un écran simple.
Mais quand l’écran devient plus complexe, plusieurs variables peuvent devenir difficiles à synchroniser.
3. Le problème avec plusieurs booléens
Exemple fragile :
Le problème : plusieurs états peuvent être vrais en même temps.
Exemple incohérent :
Dans ce cas, l’écran est difficile à comprendre.
Il vaut souvent mieux représenter l’état complet avec une seule enum.
4. Version propre avec une enum
Ici, l’écran ne peut être que dans un seul état à la fois.
C’est plus clair :
5. Exemple avec simulation de chargement
Ici :
.tasklance le chargement ;state = .loadingaffiche le loader ;state = .loaded(users)affiche la liste ;state = .emptyaffiche un message vide ;state = .error(...)affiche une erreur.
6. Utiliser @ViewBuilder pour découper le body
Quand un body devient trop long, tu peux découper l’affichage dans une propriété.
Puis dans le body :
@ViewBuilder permet de retourner différentes vues selon les cas.
7. Version avec ViewModel
Dans une vraie app, l’état sera souvent dans un ViewModel.
Vue :
Cette version est plus proche d’une vraie app MVVM.
La vue affiche l’état.
Le ViewModel décide de l’état.
8. Créer des vues dédiées pour chaque état
Pour garder un écran lisible, tu peux créer des petites vues dédiées.
Utilisation :
9. Enum générique réutilisable
Tu peux créer un état générique pour plusieurs écrans.
Exemple :
Utilisation :
C’est utile si plusieurs écrans ont la même logique de chargement.
10. Cas avec données déjà chargées puis refresh
Parfois, tu ne veux pas remplacer tout l’écran par un loader pendant un refresh.
Exemple : une liste déjà affichée se met à jour en arrière-plan.
Dans ce cas, tu peux séparer :
Pourquoi ?
Parce que l’écran peut être dans cet état :
Une enum simple loading/loaded/error peut être trop limitée pour ce cas.
Donc il faut adapter selon le besoin.
11. Quand utiliser une enum d’état
Utilise une enum quand l’écran doit être dans un seul état principal à la fois.
Exemples :
C’est parfait pour :
- chargement initial ;
- écran détail ;
- résultat de recherche ;
- liste simple ;
- écran profil ;
- appel API unique.
12. Quand garder plusieurs propriétés
Garde plusieurs propriétés quand les états peuvent exister ensemble.
Exemple :
Dans ces cas, il est normal d’avoir :
Résumé
À retenir :
- un écran réel a souvent plusieurs états : loading, loaded, empty, error ;
- plusieurs booléens peuvent créer des états incohérents ;
- une enum permet de représenter clairement un seul état principal ;
switch stateest très pratique dans SwiftUI ;@ViewBuilderaide à découper un affichage conditionnel ;- dans une vraie app MVVM, l’état est souvent dans le ViewModel ;
- tu peux créer des vues réutilisables pour loading, empty et error ;
- une enum est idéale pour un chargement initial simple ;
- plusieurs propriétés peuvent être préférables si plusieurs états doivent coexister.