我有一个 Swift ui 视图,其中有一个儿童女巫从 @State 变量获取值。当我更新 @State 变量时,视图会重建,但子视图保持不变。
struct ContentView: View {
@State var msg: String = ""
var body: some View {
VStack {
Button(action: {
self.msg = "Hallo World"
}, label: { Text("Say Hallo")})
ChildView(msg: msg).padding().background(Color.orange)
Text(msg).padding().background(Color.green)
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct ChildView: View {
@State var msg: String
var body: some View {
Text(msg)
}
}
Run Code Online (Sandbox Code Playgroud)
import SwiftUI
struct ContentView: View {
@State var msg: String = ""
var body: some View {
VStack {
Button(action: {
self.msg += "Hallo World "
}, label: { Text("Say Hallo")})
ChildView(msg: msg).padding().background(Color.orange)
Text(msg).padding().background(Color.green)
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct ChildView: View {
var msg: String
var body: some View {
Text(msg)
}
}
Run Code Online (Sandbox Code Playgroud)
您的 ChildView 中不需要任何状态属性包装器。一旦消息发生变化,SwiftUI 就会知道,每个依赖于其值的视图都应该“重新加载”。
在您的示例中,您通过将初始值包装到其状态属性包装器来“修复”它。SwiftUI 不会重新加载它,因为 @State 属性包装器意味着该值存储在 ChildView 之外。@State 属性包装器不属于视图状态。相反,一旦 @State 包装的属性发生变化,SwiftUI 将重新评估 View 的 body 计算属性。要“重置”@State属性包装值,您需要“重新创建”它,这意味着状态属性也将重置为其初始值。
| 归档时间: |
|
| 查看次数: |
2651 次 |
| 最近记录: |