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