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入职变量设置为false?

这里:通过绑定,您可以做到这一点。


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 }
}
}
}

尝试放置相同的

@AppStorage("onboardingView") var onboarding

进入链的视图并直接修改

var body: some View {
...
onboarding = false
...
}

注意:请确保在主队列上修改此设置

最新更新