0
votes

Utiliser @state se résout à «Self» utilisé avant que toutes les propriétés stockées soient initialisées

J'ai couru dans un problème lors de l'utilisation de la propriété @state.

mon contenuview.swift ressemble à ceci: xxx

et mon modificateur.swift à partir duquel le modificateur La vue est appelée a suivi du code suivant: xxx

J'ai créé ce code simplifié de mon projet réel que mon problème est plus facile à comprendre.

Le problème est que le code de la fonction init entraîne une erreur et je ne sais pas comment le résoudre.

ce que j'ai essayé et Ce dont j'aurais besoin

Parce que ceci est juste une version simplifiée de mon code actuel, il y a quelques exigences que j'ai besoin de mon code:

  • mod ne peut pas être une variable calculée
  • i en quelque sorte le modificateur sous forme de variable appelé mod dans mon contenuvoir
  • Lorsque je supprimais la propriété @state et la propriété @binding et le $ Le code fonctionne et les résultats avec 0 erreurs. Mais je dois utiliser la propriété @state (qui aboutit malheureusement aux erreurs avec mon code)
  • aussi le bouton pour masquer et montrer le texte doit fonctionner

    Je serais très reconnaissant si quelqu'un pouvait me donner un indice. J'apprécie vraiment votre aide!


0 commentaires

3 Réponses :


-1
votes

Utiliser des vues à l'intérieur Corps Contexte XXX


6 commentaires

Oui ça fonctionnerait. Mais j'ai besoin de la variable Mod. Dans ma version simplifiée, cela fonctionnerait mais dans mon vrai projet, j'ai besoin du même point de vue plusieurs fois et je veux le stocker dans une variable pour cette utilisation.


@ SP4C38 stocker des vues comme variables est presque toujours la mauvaise approche (sous la plupart des cas normaux), vous pourriez donc être sur la mauvaise piste avec votre conception.


Hmm ok. Merci. Dans mon projet réel, j'aurais besoin d'analyser la vue qui (je voulais stocker dans une variable) dans une autre vue pour appeler une fonction lors de la première vue sur un bouton de la première vue. Donc, je devrais probablement utiliser une approche différente pour cela?


@ SP4C38 Ce n'est pas tout à fait clair pour moi ce que vous entendez par "besoin d'analyser la vue ...". Les points de vue doivent être considérés comme des structures d'assurance-chômage déclaratives, et vous devriez être raisonnable en termes de données (variables d'état, de modèles de vue) et de les manipuler. Lisez sur @binding , @state et @OBServedObject / ObservableObject et lisez de différentes manières "Vues" Message de haut en bas de la hiérarchie des arbres de vue. Voici un bon Explication


Merci d'avoir examiné ma question! Je vais lire le message et verra si je peux résoudre le problème (sans stocker les vues des variables). Postera la réponse ici si je peux en trouver un. Merci encore d'avoir aidé.


J'ai essayé plusieurs approches différentes et beaucoup d'entre eux me disent que "l'accès à la valeur de l'État en dehors d'être installé sur une vue. Cela entraînera une liaison constante de la valeur initiale et ne sera pas mise à jour". Je crois qu'il n'est tout simplement pas possible d'attribuer une liaison de cette façon sans le faire à partir de corps



1
votes
Mod = Modifier(showText: _showText.projectedValue)
You can make it let instead of var if you'd like.

3 commentaires

Merci pour votre réponse. Quand j'essaie ceci, il compile et court. Mais quand je clique sur le bouton, le texte ne disparaît plus. Avez-vous peut-être une manière que je puisse utiliser le @state et que le texte disparaît?


Non; Votre exemple ne fonctionnera pas réellement. Je pensais que c'était juste une simplification. Utilisez Xcode 12 pour de meilleurs retours. Stackoverflow.com/Questions/62633728/...


Merci d'avoir examiné ma question! Je vais l'essayer avec Xcode 12 pour de meilleurs retours. Postera la réponse ici si je peux en trouver un. Merci encore d'avoir aidé.



1
votes

J'ai trouvé un moyen de faire cela. Je ne sais pas si ce sera approprié mais voici les détails.

Le problème était que Swifti n'a pas semblé permettre de définir la liaison à l'extérieur du corps code>. Donc, cette solution renvoie une nouvelle instance de modificateur p> xxx pré>

et le code pour contentView code>, où nous pouvons appeler cette fonction à partir de Body : P>

struct ContentView: View {
    @State var showText: Bool = true
    var Mod: Modifier
    
    init() {
        Mod = Modifier(showText: .constant(true)) // .constant() gives a placeholder Binding
    }
    
    var body: some View {
        return VStack {
            if showText == true {
                Text("Hello, World!")
            }
            Mod.bind(to: $showText)
        }
    }
}


2 commentaires

Merci beaucoup! J'apprécie vraiment cela. Cela résout le problème pour moi et travaille. 👍


@ SP4C38 Heureusement, j'ai pu aider! ^ - ^