首页 > 解决方案 > 按下“下一步”按钮后问题不会更新

问题描述

我正在开发一个测验应用程序,并使用下一组问题更新 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)
            }
        }
    }

标签: swiftforeachswiftui

解决方案


getRandomQuestion()中,正如您已经发现的那样,您的所有代码都附加到数组的末尾。

在函数的开头,您可以清除数组:

func getRandomQuestion() {
  possibleAnswers = []

  //the rest of the existing code here
}

推荐阅读