Fiche 02.05 — @ObservedObject en SwiftUI
Objectif
Comprendre à quoi sert @ObservedObject, quand l’utiliser, et quelle différence faire avec @StateObject.
1. L’idée à comprendre
@ObservedObject sert à observer un objet déjà créé ailleurs.
La vue qui utilise @ObservedObject ne possède pas l’objet.
Elle le reçoit depuis un parent, puis se met à jour quand cet objet change.
Schéma simple :
À retenir :
2. Code minimal
Ici :
CounterParentViewcrée le ViewModel avec@StateObject;CounterChildViewreçoit ce ViewModel ;CounterChildViewl’observe avec@ObservedObject;- quand
countchange, les vues concernées se mettent à jour.
3. Différence avec @StateObject
La règle la plus importante :
Exemple :
ProfileView possède le ViewModel.
ProfileHeaderView l’utilise simplement.
4. Pourquoi ne pas recréer le ViewModel dans chaque sous-vue ?
Pas adapté :
Le problème : cette sous-vue ne partage plus le même ViewModel que le parent.
Tu risques d’avoir :
- des données différentes ;
- des appels API dupliqués ;
- un état incohérent ;
- plusieurs ViewModels alors que tu voulais un seul état partagé.
Préférable :
5. Exemple réaliste : écran profil découpé
ViewModel :
Vue principale :
Sous-vues :
Ici, toutes les sous-vues travaillent avec le même ViewModel.
6. Passer seulement les données nécessaires
Tu n’es pas obligé de passer tout le ViewModel à chaque sous-vue.
Si une sous-vue ne fait qu’afficher une valeur, tu peux passer un let.
Exemple plus simple :
Utilisation :
C’est souvent plus propre si la sous-vue n’a pas besoin :
- de modifier le ViewModel ;
- d’appeler ses méthodes ;
- d’observer plusieurs propriétés.
7. @ObservedObject ou @Binding ?
Utilise @Binding pour modifier une valeur simple appartenant au parent.
Utilise @ObservedObject pour observer un objet complet, souvent un ViewModel.
Résumé :
8. Preview avec @ObservedObject
Une vue avec @ObservedObject doit recevoir un objet dans sa preview.
Si tu veux une preview avec un état précis :
Si Xcode refuse une modification directe dans #Preview, crée une petite vue wrapper :
9. Exemple avec injection depuis une vue parent
Cas fréquent : un écran principal crée le ViewModel, puis plusieurs sous-écrans l’utilisent.
Ici, un seul SettingsViewModel est partagé entre les sections.
10. Points à connaître
@ObservedObject ne conserve pas l’objet comme @StateObject
@ObservedObject observe un objet reçu.
Il ne dit pas à SwiftUI :
C’est le rôle de @StateObject.
Évite de créer l’objet directement dans une propriété @ObservedObject
Pas idéal :
Préférable si la vue possède l’objet :
Préférable si la vue reçoit l’objet :
Ne passe pas toujours tout le ViewModel
Si une sous-vue n’a besoin que d’une valeur, passe une valeur.
Si elle doit modifier une valeur simple, passe un Binding.
Si elle doit observer plusieurs propriétés ou appeler des méthodes, passe le ViewModel avec @ObservedObject.
Résumé
À retenir :
@ObservedObjectsert à observer un objet déjà créé ailleurs ;- il est souvent utilisé dans une sous-vue qui reçoit un ViewModel ;
- si la vue crée et possède le ViewModel, utilise
@StateObject; - si la vue reçoit le ViewModel, utilise
@ObservedObject; @ObservedObjectfonctionne avecObservableObjectet@Published;- pour une simple valeur modifiable,
@Bindingest souvent plus adapté ; - pour une simple valeur en lecture, un
letsuffit.