Le code suivant produit l'erreur d'exécution: @environmentObject Erreur: Peut être manquant comme un ancêtre de cette vue. Le TSTE dans l'environnement est un @OBServedObject.
struct TEditorView: View { @EnvironmentObject private var tState: TState @State var name = "" init() { self._name = State(initialValue: tState.name) } var body: some View { ... } }
3 Réponses :
La réponse est qu'un objet d'environnement n'est apparemment pas accessible dans une fonction init (). Cependant, une observation objecte peut être. J'ai donc changé le code et cela fonctionne. Pour faciliter la tâche, j'ai tourné Tstate dans un singleton que je pouvais accéder n'importe où. Cela pourrait probablement remplacer l'utilisation de @environmentObject dans de nombreuses situations.
struct TEditorView: View { @ObservedObject private var tState = TState.shared //@EnvironmentObject private var tState: TState @State var name = "" init() { self._name = State(initialValue: tState.name) } var body: some View { ... } }
Dans iOS 14, vous pouvez également utiliser «@stateObject» à la place de '@observedObject'. La clé ici est vraiment que vous accédez à l'objet Tstate comme un singleton au lieu de via '@environmentObject'. Les autres réponses ne semblent pas résoudre le problème: lorsque vous devez accéder à l'objet à init ().
Une approche différente ici pourrait être d'injecter la valeur initiale ou utilisez un En général, je me pose également de question pourquoi vous avez besoin du Si vous avez besoin de Transformations de données Il devrait être effectué dans le modèle d'objet lui-même, pas la vue. P> p> ttstate code> dans le constructeur et en faire avec le
@environmentObject code> complètement. Ensuite, à partir de la vue du parent, vous pouvez utiliser la valeur
@environmentObject code> lors de la création de la vue.
@binding code> au lieu de < code> @state code> si le nom code> la valeur code> est destiné à être bidirectionnel. p>
@environmentObject code> dans le constructeur. L'idée est avec un
@environmentObject code> est qu'il est représenté le même dans toutes les vues, vous ne devez donc en avoir besoin que
corps code>. P>
Le https://developer.apple.com/documentation/swiftui/state a> p> un https://developer.apple.com/documentation/commine/observableObject
https://developer.apple.com/documentation/swiftui/stateObject P > ci-dessous est un exemple de code p> @state code> doit être défini comme
privé code> et par la documentation doit être accédé uniquement dans le
afficher code>
corps code >.
@environmentObject code> doit être défini à l'aide de
contentView (). EnvironmentObject ( Code> YourobservableObject
) code> P>