我正在SWIFT中创建一个测验应用程序.每个测验都有一组问题,这些问题在QuestionView中表示."下一步"按钮应该显示与"QuestionView"相同的视图,但带有数组的下一个问题.但是,QuestionView总是显示相同的问题.

以下是问题视图:

struct QuestionView: View {

var quiz: Quiz
var question: Question

@State private var isFinished = false
@State private var success = true

var body: some View {
    VStack(spacing: 40) {
        VStack {
            Text(quiz.name)
                .font(.title3)
                .bold()
            
            HStack(spacing: 20) {
                ProgressBar(progress: 250 / CGFloat(quiz.questions.count) * CGFloat(quiz.progress))
                Text("\(quiz.progress + 1)/\(quiz.questions.count)")
                    .bold()
            }
        }
        
        Text(question.questionText)
            .font(.title)
            .fontWeight(.semibold)
            .frame(width: 300)
        
        Spacer()
        
        LazyVGrid(columns: [GridItem(.adaptive(minimum: 160, maximum: 240))], spacing: 10) {
            ForEach(question.answers) { index in
                AnswerRow(answer: index)
                    .onTapGesture {
                        if index.isCorrect && success == true {
                            self.quiz.score += 1
                            self.quiz.progress += 1
                            isFinished = true
                        } else if index.isCorrect {
                            self.quiz.progress += 1
                            isFinished = true
                        } else {
                            success = false
                        }
                    }
            }
        }
        
        NavigationLink {
            QuestionView(quiz: quiz, question: quiz.questions[quiz.progress])
        } label: {
            PrimaryButton(text: "Continuer")
        }
        //.disabled(!isFinished)

    }
    .padding(.vertical, 60)
    .navigationBarHidden(true)
}
}

以下是测验模型:

class Quiz: Identifiable {
let id = UUID()
let name: String
let illustration: String
let difficulty: Difficulty
let questions: [Question]
var score: Int
var progress: Int

init(name: String, illustration: String, difficulty: Difficulty, questions: [Question], score: Int, progress: Int) {
    self.name = name
    self.illustration = illustration
    self.difficulty = difficulty
    self.questions = questions
    self.score = score
    self.progress = progress
}
}

extension Quiz {
static let examples: [Quiz] = [
    Quiz(
        name: "Quiz n°1",
        illustration: "Picture1",
        difficulty: .easy,
        questions: Question.allQuestions1,
        score: 0,
        progress: 0
    ),
    
    Quiz(
        name: "Quiz n°2",
        illustration: "Picture2",
        difficulty: .intermediate,
        questions: Question.allQuestions2,
        score: 0,
        progress: 0
    ),
    
    Quiz(
        name: "Quiz n°3",
        illustration: "Picture3",
        difficulty: .advanced,
        questions: Question.allQuestions3,
        score: 0,
        progress: 0
    )
]
}

推荐答案

也许你可以试着用一系列的问题.[Question]

大概是这样的:

var questions = [Question(questionText: "Some text",
                          possibleAnswers: ["Option 1", "Option 2", "Option 3"]
                          correctAnswer: "Option 2"),

                 Question(questionText: "Some other text",
                          possibleAnswers: ["Option 1", "Option 2", "Option 3"]
                          correctAnswer: "Option 1")]

并拥有一个问题编号变量,每次用户进入下一个问题时该变量都会增加

类似于:

@State private var questionNumber = 0

然后,要一次显示一个问题:

// The actual question
Text(questions[questionNumber].questionText)

// All the possible answers
ForEach(questions[questionNumber].possibleAnswers, id: \.self) { answer in 
        // Some view that takes in a string (the answer) and display it
        Text(answer)
}

现在要做的就是增加问题编号(questionNumber += 1).我相信在您的情况下,只需按下"下一步"按钮即可完成:

Button("Next") {
    questionNumber += 1
}

希望这对你有帮助!

注意事项

我还没有测试过上面的代码,它只是为了帮助您弄清楚????(虽然代码可能会运行)

Swift相关问答推荐

在运行时检测蒸汽工人的类型

RealityKit如何获得两个相对大小相同的ModelEntity?

如何在向照片添加文本时定义文本对齐、文本背景的Alpha和在文本之前添加图像

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

为SwiftUI文本视图提供固定宽度,并仅在文本换行时使文本视图底部增大

像WebSocket一样接收实时更新,但通过异步/等待或组合

SWIFT异步/等待,多个监听程序

不能将符合协议的SWIFT类的实例分配给需要该协议的Objective-C属性

以编程方式使UIView居中,而不影响UIKit中其他UI类的位置

避免 `(())` 显式指定 Void 类型的枚举关联值

如何在 SwiftUI 中创建条件内容?

标有@MainActor 的函数中的异步调用是否也在主线程上运行?

如何判断一个值是否为 Int 类型

任何使 ScrollView 像 List 一样执行更灵活的修饰符?

如何从 LLDB 调用带有断点的 Swift 函数?

What is "SwiftPM.SPMRepositoryError error 5"?

临时添加到视图层次 struct 后,Weak view引用不会被释放

如何使用 Swift/iOS 为人类书写的笔画制作动画?

使用 DispatchTime.now() + float 延迟?

快速延迟加载属性