如何在SwiftUI预览中更新@State属性以展示不同视图变体
问题成因
- @State 是 SwiftUI 提供的状态管理属性包装器,它的真实值并不存储在 View 结构体本身中,而是由 SwiftUI 框架在外部单独托管维护。View 结构体本身只是描述视图的临时值,不是真实的视图实例。
- 你在
customize闭包里直接修改结构体实例的text属性,本质只是修改了当前临时结构体副本的属性包装器外层值,并不会修改 SwiftUI 框架托管的状态存储值。当视图正式被渲染到预览树时,@State 会默认使用你声明时给出的初始值"Hello, ",之前的赋值会直接被丢弃。 - 而普通存储属性
text2可以正常修改,是因为它的值直接存储在 View 结构体本身,修改结构体副本的属性就会生效。
修复方案
推荐的最优方案是给 View 添加自定义构造器,显式为 @State 属性传入初始值,在构造器中直接初始化属性包装器本身:
struct TestView: View { @State fileprivate var text :String fileprivate var text2 :String = "World!" // 自定义构造器,给参数设置默认值不影响原有调用逻辑 init(text: String = "Hello, ", text2: String = "World!") { // 下划线前缀访问属性包装器本身,直接初始化状态值 self._text = State(wrappedValue: text) self.text2 = text2 } var body: some View { Text(text + text2) } } struct TestView_Previews: PreviewProvider { static var previews: some View { TestView() // 直接传入自定义参数即可生效 TestView(text: "こんにちは", text2: "世界") .previewDisplayName("Testing") } }
内容的提问来源于stack exchange,提问作者mash
相关产品推荐
相关产品推荐

