Aloha,

Introduction

L'idée est de créer un jeu de quiz dans lequel vous avez un nombre variable de boutons, une réponse est «juste», les autres sont «fausses». Lors de la sélection d'un bouton, la couleur du "bouton droit" doit devenir verte, le reste devient rouge.

Fonctionnement de l'application

L'application charge toutes les données d'un fichier Swift appelé LectureTopics (voir ci-dessous). LectureTopics est une structure qui contient de nombreuses variables (ButtonText, ButtoneAnswerCorrect (Bool) Descriptions, etc.) et une extension qui contient le contenu de ces variables (Level 1, 2 etc.)

Problème

Je crée plusieurs boutons avec une boucle «for in» (voir ci-dessous). Cependant, tous les boutons deviennent rouges ou verts. L'application sait déjà quel bouton est erroné ou correct. Pour cela, j'utilise la variable "Level0ButValue" (voir ci-dessous). Cependant, il ne devrait en théorie que tourner la bonne réponse en vert et les autres en rouge. J'apprécierais vraiment toute sorte d'aide. Je suis encore nouveau en programmation :-) Merci d'avance!

struct Level0View: View {
    
    let lectureTopic: LectureTopic
    @State var Thacolor:String = "BlueAccent"
    
    var body: some View {
        
        VStack{
            Text(lectureTopic.Level0Name)
            .font(Font.custom("Arial", size: 24))
            .multilineTextAlignment(.center)
            .padding(.bottom)
            .padding()
            
            Text(lectureTopic.Level0Text)
            .font(Font.custom("Arial", size: 18))
            .multilineTextAlignment(.center)
            .padding()
            
            Text(lectureTopic.Level0Question)
            .font(Font.custom("Arial", size: 22))
            .fontWeight(.heavy)
            
            Spacer()
            
            VStack{
            
            ForEach(0..<self.lectureTopic.Level0Buttons.count)
            { number in
                
            Spacer()
                
            Button(action:
            {
                if self.lectureTopic.Level0ButValue[number] == true
                {
                    self.Thacolor = "GreenAccent"
                }
                else
                {
                    self.Thacolor = "RedAccent"
                }
            })
            {
            Text(self.lectureTopic.Level0Buttons[number])
            }
            .foregroundColor(.white)
            .padding()
            .padding([.leading, .trailing])
            .background(Color(self.Thacolor))
            .cornerRadius(10)
            }
            
            Spacer()
                
            Image("Window1")
                .resizable()
                .frame(width: 420, height: 190)
            
            }
            
        }
    
}
}

struct Level0View_Previews: PreviewProvider {
    static var previews: some View {
        Level0View(lectureTopic: LectureTopic.all()[0])
    }
}



struct LectureTopic: Identifiable {
    
    var id = UUID()
    let LectureTitle: String
    let MainMenuText: String
    let MainImage: String
    let OverviewText: String
    let Level0Name: String
    let Level0Text: String
    let Level0Question: String
    let Level0Buttons: [String]
    let Level0ButValue: [Bool]
    let Level1Name: String
    let Level1Text: String
  
}

extension LectureTopic
{
    static func all() -> [LectureTopic]
    {
        return
        [
            LectureTopic(
                LectureTitle: "Basics",
                MainMenuText: "Hier lernst du die Basics, von der Jobsuche bis hin zu allgemeinen Informationen.",
                MainImage: "Window1",
                OverviewText: "Nach drei Semestern studieren sucht Tim nach einer Möglichkeit erste, fachliche Berufserfahrung zu sammeln. Hierzu macht er sich auf die Suche nach einem Job den er neben dem Studium ausüben kann. ",
                Level0Name: "Wie kann Tim?",
                Level0Text: "Frage",
                Level0Question: "Text11",
                Level0Buttons: ["hi","Mu","Na"],
                Level0ButValue: [true,false,false],
                Level1Name: "alalal",
                Level1Text: "Jojo"),
            
        ]
    }
}
1
Tobi 23 oct. 2020 à 12:44

3 réponses

Meilleure réponse

Puisque vous voulez changer les couleurs de tous les boutons dès qu'un est sélectionné, alors vous avez besoin d'une variable @State qui reflète cela.

Ajouter:

@State private var answered = false

Ensuite, vos boutons définiront self.answered = true. La couleur du bouton dépendra de l'état de answered et self.lectureTopic.Level0ButValue[number]:

Button(action:
{
    self.answered = true
})
{
    Text(self.lectureTopic.Level0Buttons[number])
}
.foregroundColor(.white)
.padding()
.padding([.leading, .trailing])
.background(Color(self.answered ? (self.lectureTopic.Level0ButValue[number] ? "GreenAccent" : "RedAccent") : "BlueAccent")))
.cornerRadius(10)
0
vacawama 23 oct. 2020 à 12:22

J'ai préparé un exemple plus général qui n'est pas directement lié à votre code mais fait exactement ce que vous voulez réaliser. Vous pouvez ensuite appliquer cette approche à votre implémentation exacte. La partie importante est qu'il y a maintenant une deuxième vue juste pour le bouton qui a son propre @State pour contrôler la couleur du bouton.

import SwiftUI

struct ContentView: View {
    
    let buttons = [ButtonData(text: "around 100", bool: false), ButtonData(text: "around 7.8 Billion", bool: true), ButtonData(text: "around 3712", bool: false)]
    
    var body: some View {
        VStack {
            
            Text("what is the world population in 2020?")
            
            ForEach(buttons) { buttonData in
                ButtonView(buttonData: buttonData)
            }
        }
    }
}

struct ButtonView: View {
    
    let buttonData: ButtonData
    
    @State private var color: Color = .primary
    
    var body: some View {
        Button {
            if buttonData.bool {
                color = .green
                return
            }
            color = .red
        } label: {
            Text(buttonData.text)
                .foregroundColor(color)
        }

    }
}

struct ButtonData: Identifiable {
    let id = UUID()
    let text: String
    let bool: Bool
}
0
Mamaessen 23 oct. 2020 à 12:26

Je changerai l'approche au lieu de

.background(Color(self.Thacolor))

J'aurai un bool (rightAnswer: Bool) un changement de couleur en fonction de la réponse

.background(rightAnser: .blue ? .red)
-2
Carlos Maria Caraccia 23 oct. 2020 à 10:36