watchOS App, Prozente verschwinden nach Neustart

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • watchOS App, Prozente verschwinden nach Neustart

    Hallo,

    ich versuche gerade meine erste Anwendung zu erstellen - für watchOS. Ist nicht besonders aufwendig, sie ist eigentlich nur ein kleines Hilfsmittel für mein Studium, wo alle Prüfungen aufgelistet sind.
    Nun wollte ich eine Funktion einbauen, dass - sobald ich eine Prüfung grün markiert habe - sich automatisch der Studienfortschritt (also die Prozentzahl) gemäß dem Verhältnis der gesamten ECTS für das Studium und der ECTS für die einzelnen Prüfungen.
    Habe nun eingebaut, dass die grüne Markierung bei den Prüfungen auch bestehen bleibt, wenn man die Anwendung neu startet, also so lange, bis ich es selber wieder demarkiere.
    Grundsätzlich funktioniert das ganze ganz ok, nur, wenn ich die Anwendung neu starte, ist der Studienfortschritt wieder bei 0,00 % - obwohl die Prüfungen noch immer grün markiert sind. Ich muss dann die Prüfung wieder demarkieren, erneut markieren, erst dann erhöht sich wieder die Prozentzahl im Studienfortschritt.

    Weiß jemand, was ich hier ändern muss, damit die Prozentzahl bei Neustart übernommen wird und nicht wieder bei 0,00 % ist?

    Habe das ganze auch schon in meiner Verzweiflung schon durch ChatGpt 4.0 laufen lassen, aber funktioniert noch immer nicht.
    Wäre über jede Hilfe dankbar.. Da ich absoluter Anfänger, weiß ich nun nicht mehr weiter.

    Quellcode

    1. import SwiftUI
    2. enum CourseCategory {
    3. case firstSection
    4. case secondSection
    5. case freeStudy
    6. }
    7. // Modell für Lehrveranstaltung mit Kategorie
    8. struct Course: Identifiable {
    9. let id = UUID()
    10. let name: String
    11. let ects: Int
    12. var isCompleted: Bool = false
    13. let category: CourseCategory
    14. }
    15. // ViewModel zur Verwaltung des Studienfortschritts
    16. class StudyProgressViewModel: ObservableObject {
    17. @Published var courses: [Course] = [
    18. Course(name: "Prüfung 1", ects: 4, category: .firstSection),
    19. Course(name: "Prüfung 2", ects: 10, category: .secondSection),
    20. ]
    21. let maxECTSPerSection: [CourseCategory: Int] = [
    22. .firstSection: 44,
    23. .secondSection: 172,
    24. .freeStudy: 24
    25. ]
    26. init() {
    27. loadCompletedCourses()
    28. print("Geladener Fortschritt: \(self.progress)%")
    29. }
    30. func saveCompletedCourses() {
    31. let completedCourses = courses.filter { $0.isCompleted }.map { $0.id.uuidString }
    32. UserDefaults.standard.set(completedCourses, forKey: "completedCourses")
    33. UserDefaults.standard.synchronize()
    34. }
    35. func refreshProgress() {
    36. self.objectWillChange.send()
    37. }
    38. func loadCompletedCourses() {
    39. print("Lade abgeschlossene Kurse...")
    40. guard let completedCourseIDs = UserDefaults.standard.array(forKey: "completedCourses") as? [String] else {
    41. print("Keine gespeicherten Kurs-IDs gefunden.")
    42. return
    43. }
    44. print("Gespeicherte Kurs-IDs: \(completedCourseIDs)")
    45. let completedCourseUUIDs = Set(completedCourseIDs.compactMap { UUID(uuidString: $0) })
    46. for i in 0..<courses.count {
    47. let wasCompleted = courses[i].isCompleted
    48. courses[i].isCompleted = completedCourseUUIDs.contains(courses[i].id)
    49. if wasCompleted != courses[i].isCompleted {
    50. print("Statusänderung: \(courses[i].name) ist jetzt \(courses[i].isCompleted ? "abgeschlossen" : "nicht abgeschlossen")")
    51. }
    52. }
    53. print("Nach dem Laden ist der Fortschritt: \(progress)%")
    54. }
    55. var progress: Double {
    56. let completedECTS = courses.filter { $0.isCompleted }.reduce(0) { $0 + $1.ects }
    57. return (Double(completedECTS) / Double(240)) * 100
    58. }
    59. func toggleCourseCompleted(courseID: UUID) {
    60. if let index = courses.firstIndex(where: { $0.id == courseID }) {
    61. courses[index].isCompleted.toggle()
    62. let category = courses[index].category
    63. let currentECTS = completedECTS(for: category)
    64. if let maxECTS = maxECTSPerSection[category], currentECTS > maxECTS {
    65. courses[index].isCompleted.toggle() // Änderung rückgängig machen, falls das Limit überschritten wird
    66. } else {
    67. saveCompletedCourses() // Änderungen speichern
    68. }
    69. } else {
    70. print("Kurs mit ID \(courseID) nicht gefunden.")
    71. }
    72. }
    73. private func completedECTS(for category: CourseCategory) -> Int {
    74. return courses.filter { $0.category == category && $0.isCompleted }.reduce(0) { $0 + $1.ects }
    75. }
    76. }
    77. struct StudyProgressView: View {
    78. @EnvironmentObject var viewModel: StudyProgressViewModel
    79. var body: some View {
    80. VStack {
    81. // Verwende viewModel.progress direkt hier
    82. Text("Gesamtfortschritt: \(viewModel.progress, specifier: "%.2f")%")
    83. }
    84. }
    85. }
    Alles anzeigen