SwiftUI视图间变量共享、全局设置及持久化存储相关问题咨询
问题1:变量类型更换为Float,实现流程是否会发生变化?
整体实现逻辑和String类型完全一致,仅需调整TextField的绑定写法:默认TextField绑定String类型,绑定Float时需使用带格式的初始化方法,示例如下:
@State var anyfloat: Float = 0 // TextField写法调整为 TextField("输入数字", value: $anyfloat, format: .number)
其余全局共享、持久化的流程均和String类型没有差异。
问题2:如何将该变量设置为所有新增视图均可访问的全局变量?
不推荐使用普通全局变量,普通全局变量变更无法触发SwiftUI视图自动刷新,建议使用SwiftUI原生的EnvironmentObject方案,实现步骤如下:
- 新建ObservableObject数据管理类
import SwiftUI class AppGlobalData: ObservableObject { // 存储需要全局共享的变量,String类型示例 @Published var anytext: String = "" // 若为Float类型替换为下行即可 // @Published var anyfloat: Float = 0 }
- 在应用入口注入全局对象
如果是SwiftUI App生命周期,代码如下:
@main struct YourAppName: App { // 初始化全局数据对象 @StateObject private var globalData = AppGlobalData() var body: some Scene { WindowGroup { Entry() // 注入到视图树,所有子视图都可访问 .environmentObject(globalData) } } }
- 调整原有Entry视图的调用方式
struct Entry: View { // 读取全局数据对象,无需手动传值 @EnvironmentObject var globalData: AppGlobalData var body: some View { VStack { TextField("Enter text here", text: $globalData.anytext) .padding() .border(Color.black, width: 1) .padding() } } }
- 后续新增视图需要调用该变量时,只需要在视图内声明
@EnvironmentObject var globalData: AppGlobalData即可直接读写,所有视图的变量变更会自动同步。
问题3:应用重启后该变量是否会自动清除?如何实现重启后仍留存?
- 所有存在内存中的变量(包括@State、EnvironmentObject、普通全局变量)在应用重启后都会自动清除,不会留存。
- 要实现持久化存储,可根据数据量级选择方案:
- 小数据量首选
UserDefaults,仅需修改全局数据类的变量实现即可,示例如下:
class AppGlobalData: ObservableObject { @Published var anytext: String = UserDefaults.standard.string(forKey: "saved_anytext") ?? "" { didSet { // 变量变更时自动存到本地 UserDefaults.standard.set(anytext, forKey: "saved_anytext") } } // Float类型示例 // @Published var anyfloat: Float = UserDefaults.standard.float(forKey: "saved_anyfloat") { // didSet { // UserDefaults.standard.set(anyfloat, forKey: "saved_anyfloat") // } // } }- 如果数据量大、结构复杂,iOS 17及以上推荐使用SwiftData,iOS 16及更低版本可使用Core Data实现本地持久化。
- 小数据量首选
内容的提问来源于stack exchange,提问作者GCMeccariello
相关产品推荐
相关产品推荐

