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

SwiftUI中如何将状态数据存储到数据模型中供多视图及API调用

正确实现跨视图共享状态模型的方案

你之前的代码存在3个核心问题:

  • 定义的Data是普通结构体,不具备状态发布能力,且@Binding仅用于视图之间的数值传递,不能作为模型层的存储属性
  • 在RegionView的回调里临时创建的Data实例没有被持有,赋值后就会被销毁,数据无法持久存储
  • Temp视图里用@ObservedObject修饰的类型不符合ObservableObject协议,直接调用Data.region是访问不存在的静态属性,必然报错

第一步:定义符合要求的共享数据模型

首先将模型改为符合ObservableObject协议的类,所有需要跨视图共享的字段用@Published修饰,建议改名避免和系统自带的Data类型冲突:

import SwiftUI
class FormData: ObservableObject {
    // 所有需要收集的字段都在此定义,后续新增步骤的字段直接追加即可
    @Published var region: String = ""
    @Published var userName: String = ""
    @Published var phone: String = ""
}

第二步:在根视图注入全局模型实例

要让所有子视图都能访问到同一个模型实例,需要在应用根层级注入环境对象:

@main
struct MultiStepApp: App {
    // 全局持有唯一的FormData实例
    @StateObject private var formData = FormData()
    
    var body: some Scene {
        WindowGroup {
            // 替换为你的第一个流程视图,注入环境对象
            RegionView()
                .environmentObject(formData)
        }
    }
}

第三步:修改地区选择视图逻辑

不需要在页面内单独存储选中状态,直接使用共享模型存储数据:

struct RegionView: View {
    // 从环境中取出全局共享的FormData实例
    @EnvironmentObject var formData: FormData
    
    var body: some View {
        // 其他页面代码
        RegionGroups { selected in
            // 直接赋值到共享模型,所有引用该模型的视图都会自动同步更新
            formData.region = selected
        }
        // 其他页面代码
    }
}

第四步:修改Temp测试页实现

import SwiftUI

struct Temp: View {
    @EnvironmentObject var formData: FormData

    var body: some View {
        Text(formData.region)
    }
}

struct Temp_Previews: PreviewProvider {
    static var previews: some View {
        // 预览时需要注入模拟实例避免报错
        Temp()
            .environmentObject(FormData())
    }
}

后续使用说明

  • 所有流程步骤的视图都可以通过@EnvironmentObject var formData: FormData获取同一个实例,修改任意属性都会全局同步
  • 流程结束调用API时,直接读取该实例的所有属性拼接请求参数即可

内容的提问来源于stack exchange,提问作者Bnd10706

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:08