如何解决SwiftUI ListView 未访问 ForEach 循环
我正在使用 SwiftUI(我是新的)和 Firebase 与 Swift 一起做一个项目。
我想从我从 Firebase 检索并存储在字典数组中的数据中显示关于 List View
的信息,这工作正常,因为我可以在控制台的列表单元格中显示我想看到的信息但是 Swift 没有访问我正在读取数组数据的 ForEach 循环。
我尝试过的:
- 将
id: \.self
添加到 ForEach 循环中。 - 使
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()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。