有没有一种方法可以只更新EnvironmentObject中的某些元素

时间:2020-07-06 22:01:18

标签: swift swiftui

例如,我希望每个列表元素都独立于另一个数据。

这样,更改一个名称不会影响另一个。但是,如果它们从另一个视图更改,我也希望更新列表。

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 = []
    }
}

1 个答案:

答案 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