我经常不理解SwiftUI何时重置视图的状态(即所有标记为@State的内容)。例如,看下面这个最简示例:
import SwiftUI
struct ContentView: View {
@State private var isView1Active = true
let view1 = View1()
let view2 = View2()
var body: some View {
VStack {
if isView1Active {
view1
} else {
view2
}
Button(action: {
self.isView1Active.toggle()
}, label: {
Text("TAP")
})
}
}
}
struct View1: View {
@State private var text = ""
var body: some View {
TextField("View1: type something...", text: $text)
}
}
struct View2: View {
@State private var text = ""
var body: some View {
TextField("View2: type something...", text: $text)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我希望这两个
TextField
保留它们的内容,但是如果您运行此示例,会出现一些奇怪的行为:
- 如果您只在预览中运行示例,则仅
View1
TextField
的内容将保留:
- 相反地,如果您在模拟器(或实际设备)上运行示例,则第一个文本字段的内容和第二个文本字段的内容都不会保留:
那么发生了什么?有没有办法告诉SwiftUI不要重置视图的@State?谢谢。
@State
只在视图层次结构内部有效。您创建View1
和View2
的方式从@State
的角度来看是无效的,因此您观察到了问题。实际上,如果您直接将View1
和View2
放置在使用view1
和view2
变量的位置,您会观察到相同的问题,因为@State
仅在视图位于视图层次结构中时才起作用。所以,您只是让自己感到困惑。 - Asperi@State
只在视图层次结构内部有效",这很遗憾,因为它有一些重要的影响。 - superpuccio