尝试使用绑定的方法
$
如示例代码所示,
...to change the value of a particular element, (in this example, grade)
struct courseItem: Identifiable {
let id = UUID() // <--- here
var name: String
var grade: String // <--- here
}
@Observable class Courses {
// <--- for testing
var items: [courseItem] = [courseItem(name: "name-1", grade: "A"),
courseItem(name: "name-2", grade: "B"),
courseItem(name: "name-3", grade: "C")
]
}
struct ContentView: View {
@State private var courses = Courses()
let grades = ["A", "B", "C"]
var body: some View{
List{
ForEach($courses.items){ $item in // <--- here
HStack{
Text(item.name)
Spacer()
Picker("Grade", selection: $item.grade) { // <--- here
ForEach(grades, id: \.self) {
Text($0)
}
}
}
}
}
}
}
如果你想通过
courses
对于其他视图,您可以使用
@Bindable var courses: Courses
以允许编辑所需的属性,例如:
struct ContentView: View {
@State private var courses = Courses() // <--- here, only one source of truth data
var body: some View {
TestOtherView(courses: courses) // <--- here
}
}
struct TestOtherView: View {
@Bindable var courses: Courses // <--- here
let grades = ["A", "B", "C"]
var body: some View {
List{
ForEach($courses.items){ $item in // <--- here
HStack{
Text(item.name)
Spacer()
Picker("Grade", selection: $item.grade) { // <--- here
ForEach(grades, id: \.self) {
Text($0)
}
}
}
}
}
}
}
注意,如果你想通过
课程
对于许多其他观点,考虑使用
@Environment(Courses.self) private var courses
请参阅以下文档
Managing model data in your app
.
例如:
struct ContentView: View{
@State private var courses = Courses()
var body: some View{
TestOtherView()
.environment(courses) // <--- here
}
}
struct TestOtherView: View{
@Environment(Courses.self) private var courses // <--- here
let grades = ["A", "B", "C"]
var body: some View{
@Bindable var courses = courses // <--- here
List{
ForEach($courses.items){ $item in // <--- here
HStack{
Text(item.name)
Spacer()
Picker("Grade", selection: $item.grade) { // <--- here
ForEach(grades, id: \.self) {
Text($0)
}
}
}
}
}
}
}