首页 > 解决方案 > SwiftUI 如何在单独的窗口中修改 @AppStorage 变量?

问题描述

我对 SwiftUI 和 swift 编程相当陌生,我对如何修改 @AppStorage 属性有疑问。

我正在尝试使用入门流程对应用程序进行编程,以便在第一次打开应用程序时向用户显示多个视图,从那时起,它直接进入主视图。

这是我在 ContentView 中的代码:

@AppStorage("onboardingView") var onboarding = true
    
    var body: some View {
        if onboarding {
            Welcome()
        }
        else {
            PrimaryView()
        }
    }

Welcome() 视图是一个 NavigationView,它会通过导航链接带您浏览一系列视图。在链的末端,最后一个视图有一个按钮,其操作是:UserDefaults.standard.set(false, forKey: "onboardingView")。

我原以为这会起作用,因为我读到@AppStorage 写入 UserDefaults.standard,但每次都会出现入职视图。

我怎样才能使@AppStorage onboarding 变量在单独的视图中设置为 false?

标签: swiftui

解决方案


在这里:使用 Binding 你可以做到。


struct ContentView: View {
    
    @AppStorage("onboardingView") var onboarding = true
    
    var body: some View {
        if onboarding {
            WelcomeView(onboarding: $onboarding)
        }
        else {
            PrimaryView(onboarding: $onboarding)
        }
    }
}

struct WelcomeView: View {
    
    @Binding var onboarding: Bool
    
    var body: some View {

        VStack(spacing: 20.0) {
            
            Text("WelcomeView").padding().background(Color.red).cornerRadius(10.0)
            Button("update onboarding to true") { onboarding = true }
            Button("update onboarding to false") { onboarding = false }
        }
    }
}

struct PrimaryView: View {
    
    @Binding var onboarding: Bool
    
    var body: some View {

        VStack(spacing: 20.0) {
            
            Text("PrimaryView").padding().background(Color.yellow).cornerRadius(10.0)
            Button("update onboarding to true") { onboarding = true }
            Button("update onboarding to false") { onboarding = false }
        }
    }
}

推荐阅读