From bde826f5c1c7fd93ea160444bd91cf16f8306d76 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 23 Aug 2025 22:26:40 +0200 Subject: [PATCH] fix: move vars to ViewModel --- .../CategorySelectionViewModel.swift | 7 +++ QuizApp/ViewModels/ViewModel.swift | 7 +++ QuizApp/Views/QuizView.swift | 51 ++++++++----------- 3 files changed, 35 insertions(+), 30 deletions(-) create mode 100644 QuizApp/ViewModels/CategorySelectionViewModel.swift diff --git a/QuizApp/ViewModels/CategorySelectionViewModel.swift b/QuizApp/ViewModels/CategorySelectionViewModel.swift new file mode 100644 index 0000000..2c90f68 --- /dev/null +++ b/QuizApp/ViewModels/CategorySelectionViewModel.swift @@ -0,0 +1,7 @@ +// +// CategorySelectionViewModel..swift +// QuizApp +// +// Created by Paul Nowotka on 23.08.25. +// + diff --git a/QuizApp/ViewModels/ViewModel.swift b/QuizApp/ViewModels/ViewModel.swift index 9f298bf..a67d4fc 100644 --- a/QuizApp/ViewModels/ViewModel.swift +++ b/QuizApp/ViewModels/ViewModel.swift @@ -17,6 +17,13 @@ class ViewModel: ObservableObject { @Published var isQuizFinished: Bool = false @Published var answeredCount: Int = 0 @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 { diff --git a/QuizApp/Views/QuizView.swift b/QuizApp/Views/QuizView.swift index 4090856..fcbfb02 100644 --- a/QuizApp/Views/QuizView.swift +++ b/QuizApp/Views/QuizView.swift @@ -16,22 +16,13 @@ struct QuizView: View { 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 { VStack { if viewModel.isQuizFinished { QuizFinishedView( score: viewModel.score, total: viewModel.questions.count, - isNewHighscore: isNewHighscore, + isNewHighscore: viewModel.isNewHighscore, onPlayAgain: { restartQuiz() }, onBackToCategories: { dismiss() } ) @@ -39,7 +30,7 @@ struct QuizView: View { AudioServicesPlaySystemSound(1322) score += viewModel.score // Highscore prüfen/setzen - isNewHighscore = viewModel.updateHighscoreIfNeeded() + viewModel.isNewHighscore = viewModel.updateHighscoreIfNeeded() } .onDisappear { viewModel.isQuizFinished = false @@ -70,23 +61,23 @@ struct QuizView: View { correctValue: correctV, unit: frage.unit ?? "", viewModel: viewModel, - value: $estimationValue, - submitted: $estimationSubmitted, - gainedPoints: $estimationPoints + value: $viewModel.estimationValue, + submitted: $viewModel.estimationSubmitted, + gainedPoints: $viewModel.estimationPoints ) { gained in viewModel.score += gained viewModel.answeredCount += 1 viewModel.selectedAnswers[viewModel.currentQuestionIndex] = 0 - isAnswered = true + viewModel.isAnswered = true } - if estimationSubmitted { + if viewModel.estimationSubmitted { Button { viewModel.loadNextQuestion() - estimationSubmitted = false - isAnswered = false - selectedAnswerIndex = nil - estimationPoints = 0 + viewModel.estimationSubmitted = false + viewModel.isAnswered = false + viewModel.selectedAnswerIndex = nil + viewModel.estimationPoints = 0 } label: { Text("Nächste Frage") .font(.headline) @@ -104,8 +95,8 @@ struct QuizView: View { MultipleChoiceQuestionView( answers: frage.answers, correctIndex: frage.correctAnswer, - selectedIndex: $selectedAnswerIndex, - isAnswered: $isAnswered, + selectedIndex: $viewModel.selectedAnswerIndex, + isAnswered: $viewModel.isAnswered, onAnswer: { index in print("Selected:", index) print("Correct:", frage.correctAnswer) @@ -118,8 +109,8 @@ struct QuizView: View { }, onNext: { viewModel.loadNextQuestion() - selectedAnswerIndex = nil - isAnswered = false + viewModel.selectedAnswerIndex = nil + viewModel.isAnswered = false } ) } @@ -135,13 +126,13 @@ struct QuizView: View { if !viewModel.isQuizFinished { ToolbarItem(placement: .navigationBarLeading) { Button("Abbrechen") { - showExitAlert = true + viewModel.showExitAlert = true } .foregroundColor(.red) } } } - .alert("Quiz verlassen?", isPresented: $showExitAlert) { + .alert("Quiz verlassen?", isPresented: $viewModel.showExitAlert) { Button("Quiz verlassen", role: .destructive) { dismiss() } @@ -153,11 +144,11 @@ struct QuizView: View { } private func buttonColor(for index: Int, correctIndex: Int) -> Color { - guard isAnswered else { return .blue } + guard viewModel.isAnswered else { return .blue } if index == correctIndex { return .green - } else if index == selectedAnswerIndex { + } else if index == viewModel.selectedAnswerIndex { return .red } else { return .gray @@ -168,8 +159,8 @@ struct QuizView: View { viewModel.currentQuestionIndex = 0 viewModel.score = 0 viewModel.isQuizFinished = false - selectedAnswerIndex = nil - isAnswered = false + viewModel.selectedAnswerIndex = nil + viewModel.isAnswered = false viewModel.answeredCount = 0 viewModel.selectedAnswers = Array(repeating: nil, count: viewModel.questions.count) }