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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:36