fix: move vars to ViewModel

This commit is contained in:
2025-08-23 22:26:40 +02:00
parent de8547749c
commit bde826f5c1
3 changed files with 35 additions and 30 deletions

View File

@@ -0,0 +1,7 @@
//
// CategorySelectionViewModel..swift
// QuizApp
//
// Created by Paul Nowotka on 23.08.25.
//

View File

@@ -17,6 +17,13 @@ class ViewModel: ObservableObject {
@Published var isQuizFinished: Bool = false @Published var isQuizFinished: Bool = false
@Published var answeredCount: Int = 0 @Published var answeredCount: Int = 0
@Published var selectedAnswers: [Int?] = [] @Published var selectedAnswers: [Int?] = []
@Published var isAnswered = false
@Published var selectedAnswerIndex: Int? = nil
@Published var showExitAlert = false
@Published var isNewHighscore = false
@Published var estimationValue: Double = 0
@Published var estimationSubmitted: Bool = false
@Published var estimationPoints: Int = 0
var progress: Double { var progress: Double {

View File

@@ -16,22 +16,13 @@ struct QuizView: View {
let category: String let category: String
@State private var selectedAnswerIndex: Int? = nil
@State private var isAnswered = false
@State private var showExitAlert = false
@State private var isNewHighscore = false
@State private var estimationValue: Double = 0
@State private var estimationSubmitted: Bool = false
@State private var estimationPoints: Int = 0
var body: some View { var body: some View {
VStack { VStack {
if viewModel.isQuizFinished { if viewModel.isQuizFinished {
QuizFinishedView( QuizFinishedView(
score: viewModel.score, score: viewModel.score,
total: viewModel.questions.count, total: viewModel.questions.count,
isNewHighscore: isNewHighscore, isNewHighscore: viewModel.isNewHighscore,
onPlayAgain: { restartQuiz() }, onPlayAgain: { restartQuiz() },
onBackToCategories: { dismiss() } onBackToCategories: { dismiss() }
) )
@@ -39,7 +30,7 @@ struct QuizView: View {
AudioServicesPlaySystemSound(1322) AudioServicesPlaySystemSound(1322)
score += viewModel.score score += viewModel.score
// Highscore prüfen/setzen // Highscore prüfen/setzen
isNewHighscore = viewModel.updateHighscoreIfNeeded() viewModel.isNewHighscore = viewModel.updateHighscoreIfNeeded()
} }
.onDisappear { .onDisappear {
viewModel.isQuizFinished = false viewModel.isQuizFinished = false
@@ -70,23 +61,23 @@ struct QuizView: View {
correctValue: correctV, correctValue: correctV,
unit: frage.unit ?? "", unit: frage.unit ?? "",
viewModel: viewModel, viewModel: viewModel,
value: $estimationValue, value: $viewModel.estimationValue,
submitted: $estimationSubmitted, submitted: $viewModel.estimationSubmitted,
gainedPoints: $estimationPoints gainedPoints: $viewModel.estimationPoints
) { gained in ) { gained in
viewModel.score += gained viewModel.score += gained
viewModel.answeredCount += 1 viewModel.answeredCount += 1
viewModel.selectedAnswers[viewModel.currentQuestionIndex] = 0 viewModel.selectedAnswers[viewModel.currentQuestionIndex] = 0
isAnswered = true viewModel.isAnswered = true
} }
if estimationSubmitted { if viewModel.estimationSubmitted {
Button { Button {
viewModel.loadNextQuestion() viewModel.loadNextQuestion()
estimationSubmitted = false viewModel.estimationSubmitted = false
isAnswered = false viewModel.isAnswered = false
selectedAnswerIndex = nil viewModel.selectedAnswerIndex = nil
estimationPoints = 0 viewModel.estimationPoints = 0
} label: { } label: {
Text("Nächste Frage") Text("Nächste Frage")
.font(.headline) .font(.headline)
@@ -104,8 +95,8 @@ struct QuizView: View {
MultipleChoiceQuestionView( MultipleChoiceQuestionView(
answers: frage.answers, answers: frage.answers,
correctIndex: frage.correctAnswer, correctIndex: frage.correctAnswer,
selectedIndex: $selectedAnswerIndex, selectedIndex: $viewModel.selectedAnswerIndex,
isAnswered: $isAnswered, isAnswered: $viewModel.isAnswered,
onAnswer: { index in onAnswer: { index in
print("Selected:", index) print("Selected:", index)
print("Correct:", frage.correctAnswer) print("Correct:", frage.correctAnswer)
@@ -118,8 +109,8 @@ struct QuizView: View {
}, },
onNext: { onNext: {
viewModel.loadNextQuestion() viewModel.loadNextQuestion()
selectedAnswerIndex = nil viewModel.selectedAnswerIndex = nil
isAnswered = false viewModel.isAnswered = false
} }
) )
} }
@@ -135,13 +126,13 @@ struct QuizView: View {
if !viewModel.isQuizFinished { if !viewModel.isQuizFinished {
ToolbarItem(placement: .navigationBarLeading) { ToolbarItem(placement: .navigationBarLeading) {
Button("Abbrechen") { Button("Abbrechen") {
showExitAlert = true viewModel.showExitAlert = true
} }
.foregroundColor(.red) .foregroundColor(.red)
} }
} }
} }
.alert("Quiz verlassen?", isPresented: $showExitAlert) { .alert("Quiz verlassen?", isPresented: $viewModel.showExitAlert) {
Button("Quiz verlassen", role: .destructive) { Button("Quiz verlassen", role: .destructive) {
dismiss() dismiss()
} }
@@ -153,11 +144,11 @@ struct QuizView: View {
} }
private func buttonColor(for index: Int, correctIndex: Int) -> Color { private func buttonColor(for index: Int, correctIndex: Int) -> Color {
guard isAnswered else { return .blue } guard viewModel.isAnswered else { return .blue }
if index == correctIndex { if index == correctIndex {
return .green return .green
} else if index == selectedAnswerIndex { } else if index == viewModel.selectedAnswerIndex {
return .red return .red
} else { } else {
return .gray return .gray
@@ -168,8 +159,8 @@ struct QuizView: View {
viewModel.currentQuestionIndex = 0 viewModel.currentQuestionIndex = 0
viewModel.score = 0 viewModel.score = 0
viewModel.isQuizFinished = false viewModel.isQuizFinished = false
selectedAnswerIndex = nil viewModel.selectedAnswerIndex = nil
isAnswered = false viewModel.isAnswered = false
viewModel.answeredCount = 0 viewModel.answeredCount = 0
viewModel.selectedAnswers = Array(repeating: nil, count: viewModel.questions.count) viewModel.selectedAnswers = Array(repeating: nil, count: viewModel.questions.count)
} }