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
相关产品推荐
相关产品推荐

