arrays - SwiftUI - 如何将数据附加到嵌套结构?
问题描述
我有连接到结构的学生类 - 详细信息。其中有一个嵌套结构 - 主题。我知道如何附加到普通结构或类,但我在尝试附加到嵌套结构时遇到了困难。我所拥有的是一个表格,其中询问学生的姓名和科目数量,之后他们必须输入科目名称和等级。然后,按 Toolbar items/NavigationBarItems 中的保存按钮。
class Students: ObservableObject {
@Published var details = [Details]()
}
struct Details: Identifiable {
let id = UUID()
let name: String
struct Subjects: Identifiable {
let id = UUID()
let name: String
let grade: String
}
let subjects: [Subjects]
}
视图类:
import SwiftUI
struct TestStudentView: View {
@StateObject var students = Students()
@State private var name = ""
@State private var numberOfSubjects = ""
@State private var subject = [String](repeating: "", count: 10)
@State private var grade = [String](repeating: "", count: 10)
@State private var details = [Details.Subjects]()
var body: some View {
NavigationView {
Group {
Form {
Section(header: Text("Student details")) {
TextField("Name", text: $name)
TextField("Number of subjects", text: $numberOfSubjects)
}
let count = Int(numberOfSubjects) ?? 0
Text("Count: \(count)")
Section(header: Text("Subject grades")) {
if count>0 && count<10 {
ForEach(0 ..< count) { number in
TextField("Subject", text: $subject[number])
TextField("Grade", text: $grade[number])
}
}
}
}
VStack {
ForEach(students.details) { student in
Text(student.name)
ForEach(student.subjects) { subject in
HStack {
Text("Subject: \(subject.name)")
Text("Grade: \(subject.grade)")
}
}
}
}
}
.navigationTitle("Student grades")
.navigationBarItems(trailing:
Button(action: {
//let details = Details(name: name, subjects: [Details.Subjects(name: "Physics", grade: "A"), Details.Subjects(name: "Computer Science", grade: "A*")])
//students.details.append(details)
//^Above to append
}, label: {
Text("Save")
})
)
}
}
}
我尝试创建一个 [Subjects] 类型的变量,但在输入文本字段值后不允许我附加它,它给了我错误:“类型'()'不能符合'视图'; 只有结构/枚举/类类型可以符合协议”(这是有道理的,因为它需要一个按钮)。一旦使用 ForEach 按下保存按钮,我也尝试过附加它,但这也给了我同样的错误。
解决方案
我认为您希望模型更改成为您Students
班级的责任。尝试添加一个公共方法Students
并从您的视图中调用它,如下所示:
class Students: ObservableObject {
@Published var details = [Details]()
public func addDetails(_ details : Details) {
details.append(details)
}
}
然后在视图中的按钮操作中,替换students.details.append(details)
为此方法的调用:
let details = Details(name: name, subjects: [Details.Subjects(name: "Physics", grade: "A"), Details.Subjects(name: "Computer Science", grade: "A*")])
students.details.append(details)
那是你想要做的吗?
推荐阅读
- flutter - 底部溢出 100.0 pxl
- javascript - Nest 无法识别来自 fetch 请求的 POST
- raspberry-pi3 - 启动和重启后,如何在后台运行 rapberry pie 中的 python 代码?
- android - react-native-reanimated:androidJavadoc 错误在 android 设备上运行 react-native 应用程序
- dpdk - DPDK 在一个端口上获得太多 rx_crc_errors
- json - 使用 VBA-JSON 库将 excel 数据转换为 json
- java - 在 Android Java 中调用另一个类中的函数
- javascript - Python 和 JavaScript 链接
- reactjs - 具有 React 上下文的当前用户
- mysql - MySQL在加入后得到两条最近的记录