Automatischer Prozentrechner

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

  • Automatischer Prozentrechner

    Hallo,

    ich habe folgendes Problem:

    Ich versuche mich an einer App, die ein kleines Hilfsmittel für mein Studium sein soll, dort die Prüfugnen anzeigt und bei anklicken der jeweiligen Prüfung wird diese grün markiert und die jeweiligen ECTS, die ich für die jeweiligen Prüfungen hinterlegt habe, erhöhen im Verhältnis dieser ECTS zu den ECTS des gesamten Studiums den Fortschritt in Prozent.
    Sie ist so aufgebaut, dass bei Start zunächst die Felder "Erster Studienabschnitt", "Zweiter Studienabschnitt", "Freie Studienleistungen" kommt, jeweils mit eigenen Detailansichten.

    Nun funktioniert das ganze für freie Studienleistungen überhaupt nicht.
    Geht man auf "Freie Studienleistungen", erscheint "KS", "AG", "UE", "KK", "VO", "VL", "ECTS aus anderen Studien", "KV", "Repetitorien".
    Diese 9 Felder wieder verweisen auf Detailansichten, wo die einzelnen prüfungen drinnen sieht, welche bei Markierung zum Fortschritt hinzugerechnet werden sollten.
    Das Problem ist aber, dass alle Prüfungen aus diesen 9 Views insgesamt nur bis 24 ECTS zum Studienfortschritt dazu zählen sollen, also ab 24 ECTS sich der Studienfortschritt in Prozent nicht mehr erhöht.
    Das Problem ist aber, wenn ich eine Prüfung grün markiere, dass die Prozentanzahl gleich bleibt und sich gar nicht erhöht...
    Weiß jemand wo hier das Problem ist?

    Ich persönlich denke, dass der Fehler in diesem Abschnitt wo liegen müsste, vermutlich in der extension. Weiß jemand weiter?



    Quellcode

    1. ]
    2. let maxECTSPerSection: [CourseCategory: Int] = [
    3. .firstSection: 44,
    4. .secondSection: 172,
    5. .freeStudy: 24
    6. ]
    7. init() {
    8. loadCourses()
    9. }
    10. var progress: Double {
    11. let completedECTS = courses.filter { $0.isCompleted }.reduce(0) { $0 + $1.ects }
    12. let totalECTS = 240 // Gesamtwert für ECTS im Studium
    13. return (Double(completedECTS) / Double(totalECTS)) * 100
    14. }
    15. func toggleCourseCompleted(courseID: String) {
    16. if let index = courses.firstIndex(where: { $0.id == courseID }) {
    17. courses[index].isCompleted.toggle()
    18. saveCourses()
    19. }
    20. }
    21. private func completedECTS(for category: CourseCategory) -> Int {
    22. let completedECTSAsDouble = courses.filter { $0.category == category && $0.isCompleted }.reduce(0.0) { $0 + $1.ects }
    23. return Int(completedECTSAsDouble)
    24. }
    25. }
    26. // Extension außerhalb der Klassendefinition
    27. extension StudyProgressViewModel {
    28. func saveCourses() {
    29. do {
    30. let encodedCourses = try JSONEncoder().encode(courses)
    31. UserDefaults.standard.set(encodedCourses, forKey: "savedCourses")
    32. } catch {
    33. print("Fehler beim Speichern der Kurse: \(error)")
    34. }
    35. }
    36. func loadCourses() {
    37. guard let savedCoursesData = UserDefaults.standard.data(forKey: "savedCourses") else { return }
    38. do {
    39. let decodedCourses = try JSONDecoder().decode([Course].self, from: savedCoursesData)
    40. DispatchQueue.main.async {
    41. self.courses = decodedCourses
    42. }
    43. } catch {
    44. print("Fehler beim Laden der Kurse: \(error)")
    45. }
    46. }
    47. }
    48. extension StudyProgressViewModel {
    49. // Ihre neue Funktion...
    50. func updateFreeStudyECTS(selectedCourses: Set<String>) {
    51. let selectedCoursesECTS = courses.filter { selectedCourses.contains($0.name) && $0.category == .freeStudy }
    52. .reduce(0.0) { $0 + $1.ects }
    53. print("Aktualisiere Free Study ECTS für ausgewählte Kurse: \(selectedCourses)")
    54. if selectedCoursesECTS <= Double(maxECTSPerSection[.freeStudy] ?? 24) {
    55. for course in courses where selectedCourses.contains(course.name) && course.category == .freeStudy {
    56. if !course.isCompleted {
    57. toggleCourseCompleted(courseID: course.id)
    58. }
    59. }
    60. } else {
    61. print("Die Gesamtanzahl der ECTS für freie Studienleistungen darf 24 nicht überschreiten.")
    62. }
    63. }
    64. }
    65. extension StudyProgressViewModel {
    66. func isCourseCompleted(courseName: String) -> Bool {
    67. return courses.first { $0.name == courseName }?.isCompleted ?? false
    68. }
    69. func toggleCourseCompletedByName(courseName: String) {
    70. print("Looking for course: \(courseName)")
    71. print("Available courses: \(courses.map { $0.name })")
    72. if let index = courses.firstIndex(where: { $0.name == courseName }) {
    73. print("Course found: \(courseName), toggling completion")
    74. toggleCourseCompleted(courseID: courses[index].id)
    75. } else {
    76. print("Course not found: \(courseName)")
    77. }
    78. }
    79. }
    80. struct StudyProgressView: View {
    81. @EnvironmentObject var viewModel: StudyProgressViewModel
    82. var body: some View {
    83. VStack {
    84. Text("Fortschritt: \(viewModel.progress, specifier: "%.2f")%")
    85. .font(.custom("Futura", size: 17))
    86. .bold() // Macht den Text fett
    87. }
    88. }
    89. }
    Alles anzeigen
  • dies hier ist quasi die Detailansicht, welcher auf die 9 oben genannten Felder verweist:
    Denke aber, dass hier nichts mehr zu korrigieren ist, sondern eher oben

    Quellcode

    1. import SwiftUI
    2. struct FreeStudyServicesView: View {
    3. let services = ["KS", "AG", "UE", "VO", "VL", "KV", "Repetitorien", "KK", "ECTS aus anderen Studien"]
    4. var body: some View {
    5. List(services, id: \.self) { service in
    6. NavigationLink(destination: destinationView(for: service)) {
    7. Text(service)
    8. }
    9. }
    10. .navigationTitle("Freie Studienleistungen")
    11. }
    12. @ViewBuilder
    13. private func destinationView(for service: String) -> some View {
    14. switch service {
    15. case "KS":
    16. KSView()
    17. case "AG":
    18. AGView()
    19. case "UE":
    20. UEView()
    21. case "VO":
    22. VOView()
    23. case "VL":
    24. VLView()
    25. case "KV":
    26. KVView() // Annahme: Es existiert eine KVView
    27. case "Repetitorien":
    28. RepetitorienView()
    29. case "KK":
    30. KKView()
    31. case "ECTS aus anderen Studien":
    32. ECTSFromOtherStudiesView()
    33. default:
    34. Text("Detailansicht für \(service) ist noch nicht implementiert.")
    35. }
    36. }
    37. }
    Alles anzeigen