【问题标题】:Checking a toggled Button for a Quiz Game in SwiftUI在 SwiftUI 中检查测验游戏的切换按钮
【发布时间】:2020-11-05 15:01:26
【问题描述】:

首先,对不起我的英语不好!我对 SwiftUI 完全陌生,我尝试创建一个包含多个选择和多个答案的测验应用程序。我创建了一个带有 ForEach 的按钮来显示可能的答案。现在我想选择正确的答案并点击复选按钮来验证选择的答案。可能有超过 1 个正确答案。

我试过这个函数,但它只有返回,如果有一个或两个

//MARK:- Funktionen
func checkAnswer() {
    if validateAnswer == quiz.correctAnswer {
        print("Richtig")
    } else {
        print("Falsch")
    }
}

我不知道如何使用正确答案验证所选答案。谁能帮我? 这是我的代码: 测验模型

struct Quiz: Identifiable {
    var id: String = UUID().uuidString
    var question: String
    var howManyAnswers: String
    var options: [PossibleAnswer]
    var correctAnswer: [String]
    var explain: String
}

extension Quiz: Equatable {}

struct PossibleAnswer : Identifiable, Equatable {
    let id = UUID()
    let text : String
}

内容视图

struct ContentView: View {
    var quiz: Quiz
    @State var isChecked:Bool = false
    @State private var showAlert: Bool = false
    @State var validateAnswer: [String] = ["Antwort 3", "Antwort 4"]

    //MARK:- Answers
            VStack {
                ForEach(quiz.options) { answerOption in
                    QuizButtonView(isChecked: isChecked, title: answerOption.text)
                        .foregroundColor(.black)
                        .padding(2.0)

                }
             
                Spacer()
                Divider()
                HStack {
                 //MARK:- Button Überprüfen & Zurück
                    Button(action: {
                        print("Ich gehe zurück")
                    }, label: {
                        Text("Zurück")
                    })
                    Button(action: {
                        checkAnswer()
                        print("Ich überprüfe...")
                        self.showAlert.toggle()
                    }, label: {
                        Text("Überprüfen")
                    })
                    .padding(.leading, 200)

还有我的 CheckButtonView

struct QuizButtonView: View {
    @State var isChecked:Bool = false
    var title:String
    
    func toggle(){
        isChecked.toggle()
        if self.isChecked == true {
            print("Antwort wurde ausgewählt")
        } else if self.isChecked == false {
            print("Antwort wurde wieder abgewählt")
        }
        
    }
   
    var body: some View {
        VStack {
            Button(action: toggle) {
                HStack{
                    Text(title)
                        .font(.system(size: 16))
                        .foregroundColor(.black)
                        .lineLimit(3)
                    Spacer()
                    Image(systemName: isChecked ? "checkmark.square.fill": "square")
                }
            }

谢谢!

【问题讨论】:

  • 我不确定这是否直接相关,但这个问题是关于一个类似的测验。也许它有帮助? stackoverflow.com/questions/64497666/…
  • 感谢您的评论! :) 这个案例对我的案例没有帮助,因为我有例如 5 个可能的答案和复选框。也许一个问题必须纠正答案。选择我的答案后,我将点击检查按钮。比他应该检查答案。
  • @AleksandarNesovanovic 你能分享你的基本代码吗?

标签: ios swiftui


【解决方案1】:

您只需要创建一个布尔数组的状态变量:

struct ContentView: View {

    private let quiz: Quiz
    @State private var userSelections: [Bool]

    init(quiz: Quiz) {
        self.quiz = quiz
        _userSelections = State(initialValue: Array(repeating: false, count: quiz.options.count))
    }

    var body: some View {
        VStack {
            ForEach(0..<quiz.options.count) { index in
                QuizButtonView(isChecked: userSelections[index], title: quiz.options[index].text)
                    .foregroundColor(.black)
                    .padding(2.0)
            }
        }
    }

    func checkAnswer() {
        let userSelectionTexts = Set(userSelections.enumerated().map({ quiz.options[$0.offset].text }))
        let correctAnswers = Set(quiz.correctAnswer)
        let isAllSelectionsTrue = userSelectionTexts == correctAnswers
        let isAllSelectionsFalse = userSelectionTexts.intersection(correctAnswers).isEmpty
        let isAnySelectionsTrue = !isAllSelectionsFalse
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2019-10-06
    • 1970-01-01
    • 2021-09-11
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多