SwiftUI ListView 未访问 ForEach 循环

问题描述

我正在使用 SwiftUI(我是新的)和 Firebase 与 Swift 一起做一个项目。

我想从我从 Firebase 检索并存储在字典数组中的数据中显示关于 List View 的信息,这工作正常,因为我可以在控制台的列表单元格中显示我想看到的信息但是 Swift 没有访问我正在读取数组数据的 ForEach 循环。

我尝试过的:

  1. id: \.self 添加到 ForEach 循环中。
  2. 使 CourseInfo 结构符合 Hashable 协议。

然后我意识到它实际上并没有进入 ForEach 循环。

我会在下面留下我的代码

谢谢。

Course.swift

import Foundation
import FirebaseAuth
import FirebaseFirestore

struct CourseInfo:Identifiable {
    let id = UUID()
    let courseName: String
    let totalStudents: Int
    let courseID: String
}

class Course: ObservableObject {
    let user = Auth.auth().currentUser
    let db = Firestore.firestore()
  
    @Published var courses = [CourseInfo]()
    
    func retreiveData() {
        // Check if the user is signed in.
        if user != nil {
            // if user is signed in --> retreive all of the user's courses and info.
            db.collection("courses").getDocuments() { [self] (querySnapshot,error) in
                // Check for errors.
                if let error = error {
                    print(error.localizedDescription)
                }
                else { // if there are not errors.
                    for course in querySnapshot!.documents {
                        let courseInfo = course.data()
                        manageData(courseInfo)
                    }
                }
            }
        }
    }// end retreiveData()
    
    private func manageData(_ courseInfo: [String : Any]) {
        var courseName: String = ""
        var students: [Any] = []
        var courseID: String = ""
        
        for (key,value) in courseInfo {
            if key == "Teacher" && value as! String == user!.uid {
                for (key,value) in courseInfo {
                    if key == "Course Name" {
                        courseName = value as! String
                    }
                    else if key == "Course ID" {
                        courseID = value as! String
                    }
                    else if key == "Students"{
                        students = value as! Array<Any>
                    }
                }
                self.courses.append(CourseInfo(courseName: courseName,totalStudents: students.count,courseID: courseID))
            }
        }
        
    } // end manageData()
}

CourseListView.swift

import SwiftUI

struct CourseListView: View {
    var thaCourse:[CourseInfo] = Course().courses
    
    var body: some View {
        List {
            ForEach(thaCourse) { course in
                CourseCell(course: course)
            }
        }
    }
}

struct CourseCell: View {
    var course: CourseInfo
    
    var body: some View {
        vstack(alignment:.leading,spacing: 3) {
            
            Text(course.courseName)
                .font(.title2)
                .fontWeight(.semibold)
                .lineLimit(2)
                .minimumScaleFactor(0.5)
            
            Text("Total de alumnos: \(course.totalStudents)")
            
            Text("ID: \(course.courseID)")
        }
    }
}

解决方法

您需要在视图中将 Course 类声明为 @StateObject(或 @ObservedObject)属性,然后通过该属性访问数组。您还需要获取您的数据,我在这里使用 onAppear

在视图出现时执行此操作
@StateObject var course: Course = Course()

var body: some View {
    List {
        ForEach(course.courses) { course in
            CourseCell(course: course)
        }
    }
    .onAppear {
        course.retreiveData()
    }
}