[Résolu] Initialiser une variable State avec une autre variable possible?

Bonjour pour faire simple j’ai une variable : State caractere qui est un tableau d’une chaine de caractère statique . @State var caracteres = Array(« J’aime swiftUI ») j’aimerai savoir si je peux l’initialiser de façon dynamique à partir d’une variable.

Ce qui me permettrait de pouvoir changer le texte à l’intérieur du tableau. et en l’occurrence je souhaiterais le faire avec la variable @Binding Var chaineSaisie:String qui est la saisie du textfield de l’utilisateur de la vue précédente.

Je sais par exemple dans que dans le onAppear je peux faire le code qui suit, mais moi je souhaite le faire pour que cela ne pose pas problème dans la boucle « ForEach(0…<caracteres.count) { index in »
Je ne sais pas comment faire.

.onAppear {
caracteres = Array(chaineSaisie)
}

Je souhaite le faire lors de l’initialisation

j’espère être claire.

// exemple complet
import SwiftUI
struct ContentView: View {
@State var texteSaisie = «  »
var body: some View {
NavigationView {
MessageToSnake(TexteSaisie: $texteSaisie)

     }
    
}

}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

import SwiftUI
struct SnakeMove: View {
-> @Binding var chaineSaisie:String <-
-> @State var caracteres = Array(« J’aime swiftUI ») <-
@State private var deplacement = CGSize.zero
@State private var changementCouleur = false
@Environment(.presentationMode) var fermerFenetre

var body: some View {
    VStack {
        Text(chaineSaisie)
        Button(action: {
            fermerFenetre.wrappedValue.dismiss()
        }, label: {
            Image(systemName: "xmark.circle.fill")
        })
    }
    Spacer()
    HStack(spacing: 0) {
        ForEach(0..<caracteres.count) { index in
            Text(String(caracteres[index]))
                .padding(5)
                .font(.title)
                .background(self.changementCouleur ? Color.red : Color.blue)
                .offset(deplacement)
                .animation(Animation.default.delay(Double(index) / 20))
        }
    }
    .gesture(
        DragGesture()
            .onChanged {self.deplacement = $0.translation}
            .onEnded{ _ in
                self.deplacement = .zero
                self.changementCouleur.toggle()
            }
    )
    .onAppear {
        
    }
    Spacer()
}

}

struct SnakeMove_Previews: PreviewProvider {
static var previews: some View {
SnakeMove(chaineSaisie: .constant(""))
}
}

import SwiftUI
struct MessageToSnake: View {
@Binding var TexteSaisie:String

var body: some View {
    VStack {
        TextField("Texte à saisir", text: $TexteSaisie)
            .textFieldStyle(RoundedBorderTextFieldStyle())
        NavigationLink(
            destination: SnakeMove(chaineSaisie: $TexteSaisie),
            label: {
                    Text("Afficher le serpent !")
                })
    }
}

}

struct MessageToSnake_Previews: PreviewProvider {
static var previews: some View {
MessageToSnake(TexteSaisie: .constant(« Texte à saisir »))
}
}

Bonjour

code complet sur GitHub

Je teste une autre solution qui consiste à créer qui consiste à créer un tableau de caractere vide et de le remplir lors de l’affichage de la vue dans la fonction onAppear. (le tableau est rempli avec la saisie utilisateur TextField).

Pouvez-vous me dire ce que je fais mal dans mon ForEach car depuis ce changement j’ai un message bizarre.

import SwiftUI
struct SnakeMove: View {
@Binding var chaineSaisie:String
//@State var caracteres = Array(« J’aime swiftUI »)
@State var caracteres = character
@State private var deplacement = CGSize.zero
@State private var changementCouleur = false
@Environment(.presentationMode) var fermerFenetre

var body: some View {  ----> Failed to produce diagnostic for expression; please file a bug report
    VStack {
        Text(chaineSaisie)
        Button(action: {
            fermerFenetre.wrappedValue.dismiss()
        }, label: {
            Image(systemName: "xmark.circle.fill")
        })
    }
    Spacer()
    HStack(spacing: 0) {
        ForEach(caracteres, id: \.self) { index in
        //ForEach(0..<caracteres.count) { index in
            Text(String(caracteres[index]))
                .padding(5)
                .font(.title)
                .background(self.changementCouleur ? Color.red : Color.blue)
                .offset(deplacement)
                .animation(Animation.default.delay(Double(index) / 20))
        }
    }
    .gesture(
        DragGesture()
            .onChanged {self.deplacement = $0.translation}
            .onEnded{ _ in
                self.deplacement = .zero
                self.changementCouleur.toggle()
            }
    )
    .onAppear {
        remplirTableau()
        
    }
    Spacer()
}

// alimente le tableau carateres
func remplirTableau() {
    for caratere in chaineSaisie {
        caracteres.append(caratere)
    }
}

}

struct SnakeMove_Previews: PreviewProvider {
static var previews: some View {
SnakeMove(chaineSaisie: .constant(""))
}
}

Bon j’ai résolu mon problème, j’arrive enfin à récupérer le texte saisi et à faire bouger le serpentin avec la souris ou mon doigt. j’ai mis à jour gitHub reste à compléter l’exemple et peaufiner le code et le message d’erreur dans la console, mais pour le moment cela marche. Bref j’avais la solution depuis hier soir sans commentaires.

Désolé d’avoir encombré le forum. Bonne soirée à tous. SwiftUI met mon apprentissage à l’épreuve.

1 « J'aime »