You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:54:04