我想知道是否有简单或正确的方法从不同的视图读取State变量值,我知道.onChange或Binding或ObservableObject(class(和…的用法。。。,但我想知道还有其他更好的方法吗?
例如,在这段代码中,我有一个名为TextView的视图,它有一个State值,我在我的ContentView中调用这个视图,现在我在ContentView中放了一个Text,我想读取TextView的State值。这份工作有空间法吗?
struct ContentView: View {
@State var readStringOfTextView: String = ""
var body: some View {
TextView()
Text(readStringOfTextView)
.foregroundColor(Color.blue)
}
}
struct TextView: View {
@State var stringOfText: String = "Hello, world!"
var body: some View {
Text(stringOfText)
.padding()
.foregroundColor(Color.red)
}
}
状态的全部意义在于它是视图的内部。如果你试图在其他地方阅读,说明你的设计出了问题。在这种情况下,您需要的工具是@Binding
。ContentView应将绑定传递给TextView。TextView中的任何更改都将被ContentView看到(在您的示例中,这没有意义,因为stringOfText
不能更改,但我假设您的代码的其余部分会以某种方式更改它(。在你的例子中,它看起来像这样:
struct ContentView: View {
@State var readStringOfTextView: String = ""
var body: some View {
TextView(stringOfText: $readStringOfTextView)
Text(readStringOfTextView)
.foregroundColor(Color.blue)
}
}
struct TextView: View {
@Binding var stringOfText : String
var body: some View {
Text(stringOfText)
.padding()
.foregroundColor(Color.red)
.onAppear {
stringOfText = "Hello, world!"
}
}
}
在中可以使用"首选项"直接将数据传递到视图层次结构中,但它要复杂得多,而且不是解决您所描述的问题的正确工具。即便如此,这就是它的样子:
- 创建一个PreferenceKey来传递数据
- 使用
.preference
在子视图中设置PreferenceKey - 使用
.onPreferenceChange
或.overlayPreferenceValue
或.backgroundPreferenceValue
读取父视图中的PreferenceKey
struct TextPreference: PreferenceKey {
static var defaultValue = "default"
static func reduce(value: inout String, nextValue: () -> String) {
value = nextValue()
}
}
struct ContentView: View {
@State var readStringOfTextView: String = ""
var body: some View {
VStack {
TextView()
.onPreferenceChange(TextPreference.self) { value in
readStringOfTextView = value
}
Text(readStringOfTextView)
.foregroundColor(Color.blue)
}
}
}
struct TextView: View {
@State var stringOfText : String = "Hello, world!"
var body: some View {
Text(stringOfText)
.padding()
.foregroundColor(Color.red)
.preference(key: TextPreference.self, value: stringOfText)
}
}