swift - 按下“下一步”按钮后问题不会更新
问题描述
我正在开发一个测验应用程序,并使用下一组问题更新 UI。第一组加载得很好,但是当我试图通过单击“下一步”按钮来获得下一组问题时 - 什么也没发生。当我尝试调试时,我注意到不是更新问题,而是将问题添加到前一组问题中。请帮我弄清楚我做错了什么。
这是我的代码:
import Foundation
import Combine
final class QuizManager: ObservableObject {
@Published var quizQuestions: [QuizModel] = Bundle.main.decode("file.json")
var imageIndex = 0
var possibleAnswers = [String]()
var correctAnswers = 0
var questionsAsked = 0
init() {
getRandomQuestion()
}
func getRandomQuestion() {
imageIndex = Int.random(in: 0..<quizQuestions.count)
if quizQuestions[imageIndex].isCompleted {
imageIndex = Int.random(in: 0..<quizQuestions.count)
}
possibleAnswers.append(quizQuestions[imageIndex].description)
var index1 = Int.random(in: 0..<quizQuestions.count)
var index2 = Int.random(in: 0..<quizQuestions.count)
if index1 == imageIndex && index1 == index2 {
index1 = Int.random(in: 0..<quizQuestions.count)
} else {
possibleAnswers.append(quizQuestions[index1].description)
}
if index2 == imageIndex && index1 == index2 {
index2 = Int.random(in: 0..<quizQuestions.count)
} else {
possibleAnswers.append(quizQuestions[index2].description)
}
possibleAnswers.shuffle()
}
func checkAnswer(answer: String) -> Bool {
questionsAsked += 1
if quizQuestions[imageIndex].description == answer {
correctAnswers += 1
}
quizQuestions[imageIndex].isCompleted = true
return quizQuestions[imageIndex].description == answer
}
}
import SwiftUI
struct QuizQestionsView: View {
@ObservedObject private var quizManager = QuizManager()
@State private var isCorrect = false
@State private var correctAnswer = 0
@State private var answerSelected = ""
@State private var isTapped = false
var body: some View {
ScrollView {
VStack {
ImageView(name: quizManager.quizQuestions[quizManager.imageIndex].image,
contentMode: .scaleAspectFit,
tintColor: .black)
.frame(minWidth: 150, idealWidth: 200, maxWidth: 250, minHeight: 150, idealHeight: 200, maxHeight: 250)
Spacer()
VStack {
ForEach(quizManager.possibleAnswers, id: \.self) { answer in
QuestionsView(answer: answer) {
self.isCorrect = self.quizManager.checkAnswer(answer: answer)
self.answerSelected = answer
self.isTapped = true
}
.disabled(isTapped)
.overlay(
RoundedRectangle(cornerRadius: 16.0)
.stroke(getColor(answer), lineWidth: 1)
)
}
}
Spacer()
Button(action: {
self.quizManager.getRandomQuestion()
}) {
Text("NEXT")
}
}
}
}
func getColor(_ tag: String) -> Color {
if answerSelected == tag {
if isCorrect {
return Color.green
} else {
return Color.red
}
} else {
if isTapped && !isCorrect {
if tag == quizManager.quizQuestions[quizManager.imageIndex].description {
return Color.green
}
}
}
return Color.accentColor
}
QuestionsView 如下所示:
var answer: String
var onTap: () -> Void
var body: some View {
Button(action: {
self.onTap()
}) {
Text(answer)
}
}
}
解决方案
在getRandomQuestion()
中,正如您已经发现的那样,您的所有代码都附加到数组的末尾。
在函数的开头,您可以清除数组:
func getRandomQuestion() {
possibleAnswers = []
//the rest of the existing code here
}
推荐阅读
- c - 如何从任何线程安全地使用 exit()
- rust - 如何取消引用选项
> 可变的? - android - 我已按照 Facebook 受众网络插页式广告的所有步骤进行操作,但仍未显示
- flutter - Flutter:如何在两个列表视图之间进行通信,其中第一个在根节点上,第二个在叶节点上
- javascript - jQuery mouseover 在带有 setInterval 和 clearInterval 的幻灯片中不起作用
- c# - 将列和行添加到 csv 文件的脚本?
- reactjs - 如何使用嵌套对象制作 setState
- asp.net-core - group by 非常慢 - 实体框架核心
- swift - 使用平移手势缩放 UITextView
- html - 如何使 div 块响应?