我正在用 Swift 创建一个测验应用程序。每个测验都有一组问题,这些问题在 QuestionView 中表示。 “下一个”按钮应该采用相同的 View “QuestionView”,但带有数组的下一个问题。但是,QuestionView 始终显示相同的问题。
这是问题 View :
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
)
]
}
最佳答案
或许您可以尝试使用一系列问题。 [问题]
像这样:
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
}
希望对你有帮助!
Note
我没有测试上面的代码,它只是为了帮助你解决问题😊(代码可能会工作)
关于arrays - 使用列表的下一项更新相同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73281486/