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 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 {

View File

@@ -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)
}