fix: move vars to ViewModel
This commit is contained in:
7
QuizApp/ViewModels/CategorySelectionViewModel.swift
Normal file
7
QuizApp/ViewModels/CategorySelectionViewModel.swift
Normal file
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// CategorySelectionViewModel..swift
|
||||
// QuizApp
|
||||
//
|
||||
// Created by Paul Nowotka on 23.08.25.
|
||||
//
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user