Swift中使用App Storage保存引导页状态问题求助
持久化引导页(Onboarding)状态的解决方案
@Published是内存级别的变量,App重启后状态会重置,要实现关闭引导页后下次启动不再显示的需求,直接用AppStorage替换@Published即可——它会自动把状态持久化到UserDefaults,同时支持响应式更新。
下面是修改后的完整代码:
1. 更新MainViewModel
用@AppStorage替代@Published,指定存储键名(可自定义,比如"showOnboarding"):
class MainViewModel: ObservableObject { @AppStorage("showOnboarding") var showOnboarding = true }
2. 简化MainScreenContainer
不需要额外的@Binding,直接通过ViewModel访问状态,@AppStorage会自动触发视图刷新:
struct MainScreenContainer: View { @ObservedObject var model: MainViewModel var body: some View { if model.showOnboarding { OnboardingView(model: model) } else { MainView(model: model) } } }
3. 调整OnboardingView
移除@Binding,直接依赖ViewModel,点击按钮时修改ViewModel的状态即可自动完成持久化:
struct OnboardingView: View { @ObservedObject var model: MainViewModel var body: some View { NavigationStack { ZStack(alignment: .top) { VStack { LazyVGrid(columns: [GridItem(), GridItem(), GridItem(alignment: .topTrailing)], content: { Button(action: { model.showOnboarding = false }, label: { Image(systemName: "xmark") }) }) } } } } }
4. App入口保持不变
@main struct MapGlider: App { @StateObject private var model = MainViewModel() var body: some Scene { WindowGroup { MainScreenContainer(model: model) } } }
修改完成后,点击引导页的关闭按钮,showOnboarding会被自动保存到本地。下次启动App时,App会直接读取这个持久化的值,跳过引导页直接进入MainView。
内容的提问来源于stack exchange,提问作者SLE
相关产品推荐
相关产品推荐

