swift - 为什么我的孩子 SwiftUI 视图没有更新?
问题描述
我有一个 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)
}
}
解决方案
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)
}
}
您的 ChildView 中不需要任何状态属性包装器。一旦 msg 发生变化,SwiftUI 就知道,每个 View 都应该根据其值“重新加载”。
在您的示例中,您通过将初始值包装到其状态属性 wrapper 来“修复”它。SwiftUI 不会重新加载它,因为@State 属性包装器意味着,值存储在 ChildView 之外。@State 属性包装器不是视图状态的一部分。恰恰相反,一旦 @State 包裹的属性发生变化,SwiftUI 将重新评估 View 的 body 计算属性。要“重置”@State 属性包装值,您需要“重新创建”它,这意味着 state 属性也将重置为其初始值。
推荐阅读
- javascript - 递归连接传递的字符串
- python - 如何根据自己的类型对 3D 数组的特定维度中的特征进行归一化
- python - 如何压缩两个不同长度的列表
- javascript - 在 HTTPS 实例中调用 HTTP 节点服务器,SSL 错误
- python - 如何在 python 中使用 selenium 访问 whatsapp web?
- objective-c - 如何在没有 <__NSSingleObjectArrayI 0x600002f1df50> 之类的任何信息的情况下将 __NSSingleObjectArrayI 转换为 String
- excel - PowerQuery - 将文件名添加为列
- d3.js - d3.js 动态图片库示例
- javascript - 停止 onclick 事件处理程序
- bash - 在 bash 中为 cmd 命名,无需编辑脚本