SwiftUI-在全局更改时更新@State

SwiftUI-在全局更改时更新@State,swiftui,Swiftui,当另一个视图上的数据发生更改时,我希望更新概览视图上的UI元素 我研究了@EnvironmentalObject和@Binding。但是,对任一对象的更新似乎都不会强制重新加载视图。仅对@State force进行更改。 此外,在下面描述的情况下,ChangeView不是Overview的子视图。因此@Binding无论如何都不是一个选项 Data.swift struct ExampleData:Hashable{ 变量id:UUID 变量名称:String } 变量globalVar:Exa

当另一个视图上的数据发生更改时,我希望更新概览视图上的UI元素

我研究了@EnvironmentalObject和@Binding。但是,对任一对象的更新似乎都不会强制重新加载视图。仅对@State force进行更改。 此外,在下面描述的情况下,ChangeView不是Overview的子视图。因此@Binding无论如何都不是一个选项

Data.swift

struct ExampleData:Hashable{ 变量id:UUID 变量名称:String } 变量globalVar:ExampleData=ExampleDataid:UUID,名称: 斯威夫特概览

结构概述视图:视图{ @国家私有var数据:ExampleData=globalVar var body:一些观点{ Textdata.name } } ChangeView.swift

结构更改视图:视图{ @国家私有var数据:ExampleData=globalVar var body:一些观点{ TextFieldName,text:$data.name,onEditingChanged:{uu}in globalVar=data},onCommit:{globalVar=data} } } ChangeView文本字段中的更改将更新globalVar。但是,当切换回视图时,这不会更新概览视图上的文本

我知道使用全局变量是一种丑陋的编码。如何处理将在大量不相关视图中使用的数据

请建议如何更好地处理这种情况。

概览视图和更改视图在其数据变量中保留ExampleData结构的不同副本当将结构分配给另一个变量时,您实际上是在复制它,而不是像对象一样引用它。所以改变一个不会影响另一个

@EnvironmentObject适合您的要求

下面是一个例子: 因为我们使用@EnvironmentObject,所以您需要将ExampleData转换为 一个类,或者使用一个类来存储它。我用后者

class ExampleDataHolder: ObservableObject {
    @Published var data: ExampleData = ExampleData(id: UUID(), name:"")
}

struct CommonAncestorOfTheViews: View {
    var body: some View {
       CommonAncestorView()
          .environmentObject(ExampleDataHolder())
    }
}

struct OverviewView: View {
    @EnvironmentObject var dataHolder: ExampleDataHolder

    var body: some View {
       Text(dataHolder.data.name)
    }
}

struct ChangeView: View {
    @EnvironmentObject var dataHolder: ExampleDataHolder

    var body: some View {
       TextField("Name", text: $dataHolder.data.name)
    }
}
Overview和ChangeView在其数据变量中保存ExampleData结构的不同副本当将结构分配给另一个变量时,您实际上是在复制它,而不是像对象一样引用它。所以改变一个不会影响另一个

@EnvironmentObject适合您的要求

下面是一个例子: 因为我们使用@EnvironmentObject,所以您需要将ExampleData转换为 一个类,或者使用一个类来存储它。我用后者

class ExampleDataHolder: ObservableObject {
    @Published var data: ExampleData = ExampleData(id: UUID(), name:"")
}

struct CommonAncestorOfTheViews: View {
    var body: some View {
       CommonAncestorView()
          .environmentObject(ExampleDataHolder())
    }
}

struct OverviewView: View {
    @EnvironmentObject var dataHolder: ExampleDataHolder

    var body: some View {
       Text(dataHolder.data.name)
    }
}

struct ChangeView: View {
    @EnvironmentObject var dataHolder: ExampleDataHolder

    var body: some View {
       TextField("Name", text: $dataHolder.data.name)
    }
}