如何在SwiftUI中从其他结构中读取@State变量



我想知道是否有简单或正确的方法从不同的视图读取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)
}
}

最新更新