例如,我希望每个列表元素都独立于另一个数据。
这样,更改一个名称不会影响另一个。但是,如果它们从另一个视图更改,我也希望更新列表。
struct ContentView: View {
var listView = People()
let tempPerson = Person()
var body: some View {
VStack {
Button(action: {
self.listView.people.append(self.tempPerson)
}){
Text("Add person")
}
ListView().environmentObject(listView)
}.onAppear{self.listView.people.append(self.tempPerson)}
}
}
struct ListView : View {
@EnvironmentObject var listView : People
var body: some View{
List(listView.people.indices, id: \.self) { index in
TextField("StringProtocol", text: self.$listView.people[index].name)
}
}
}
class Person {
var name = "abc"
}
class People : ObservableObject {
@Published var people : [Person]
init() {
self.people = []
}
}
答案 0 :(得分:1)
Person
是一门课。这意味着如果您创建:
let tempPerson = Person()
然后在ContentView
内部的每个地方,您将引用相同的Person
实例-您将在按钮操作中附加同一个人:
Button(action: {
self.listView.people.append(self.tempPerson)
}) {
Text("Add person")
}
我建议您将Person
更改为 struct 而不是 class :
struct Person {
var name = "abc"
}
复制结构时,每次添加新项时:
self.listView.people.append(self.tempPerson)
它将是原始tempPerson
的副本,您将可以独立更改商品。
您可以在此处了解更多信息:Structures and Classes