3 votes

SwiftUI @State pour modifier une image affichée

J'ai un dictionnaire créé à partir de la lecture de données JSON et j'utilise ces noms de variables pour alimenter d'autres vues.

Donc j'ai var charFullDetail: charDetail

Cela renvoie un certain nombre de variables, mais les deux qui m'intéressent sont les suivantes : charFullDetail.cardFrontImage charFullDetail.cardBackImage

Ils contiennent des chaînes de caractères qui correspondent à une image enregistrée dans le catalogue des actifs.

Ma vue utilise ensuite ces variables pour afficher l'image.

Image(charFullDetail.cardFrontImage)

Cela fonctionne bien.

Ce que je veux faire, c'est transformer l'image ci-dessus en quelque chose de dynamique, de sorte que si l'on tape dessus ou si l'on appuie sur un bouton, l'image affiche le contraire.

Ainsi, si .cardFrontImage est affiché et que je touche l'image, je veux que l'image soit remplacée par Image(charFullDetail.cardBackImage

Je n'arrive pas à faire fonctionner le code qui fait cela. Je pensais créer une variable @State et l'utiliser dans la fonction Image() de sorte que si cette variable est modifiée, la fonction Image() soit mise à jour.

Mais si je le fais @State var card = "charFullDetail.cardFrontImage"

et ensuite essayer d'utiliser Image(card)

Il échoue car il ne peut pas trouver l'image, car il utilise la chaîne littérale comme une chaîne plutôt que de se référer à la valeur de cette variable - si cela a un sens.

En gros, comment puis-je remplacer l'utilisation de la référence charFullDetail.cardFrontImage par une variable à état, mais faire en sorte que la valeur soit toujours référencée et ne soit pas considérée comme la chaîne "charFullDetail.cardFrontImage" ?

0voto

Josh Homann Points 7888

Utiliser l'état comme une chaîne de caractères fonctionne pour moi. Êtes-vous sûr qu'il n'y a pas un problème avec votre ressource ? Essayez ce terrain de jeu qui utilise les images système fournies par SFSymbols, puis insérez vos propres images :

import SwiftUI
import PlaygroundSupport

struct V: View {
  @State var imageName = "star"

  var body: some View {
    VStack {
      Image(systemName: self.imageName)
      Button("tap me") {
        self.imageName = self.imageName == "star" ? "star.fill" : "star"
      }
    }
  }
}

PlaygroundPage.current.setLiveView(UIHostingController(rootView: V()))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X