为什么只有当应用程序在SwiftUI中首次启动时,我才能成功地进行登录屏幕



我是SwiftUI的新手,我的应用程序中有登录屏幕,这是工作,但我只想看一次这个登录屏幕,我使用了ViewRouter类,我的项目工作,但仍然没有成功,我错过了什么?

ViewRouter:

class ViewRouter: ObservableObject {
@Published var onboardinDone = "onboardingView"
init() {
if !UserDefaults.standard.bool(forKey: "didLaunchBefore") {
UserDefaults.standard.set(true, forKey: "didLaunchBefore")
onboardinDone = "onboardingView"
} else {
onboardinDone = "initialView"
}
}
}

内容视图:

struct ContentView: View {
@State private var onboardinDone = false
var data = OnboardingData.data

var body: some View {
Group {

if !onboardinDone {
OnboardingView(data: data, doneFunction: {

self.onboardinDone = true

})
} else {
ScreenView()
}
}
}
}

您现在显示的代码中根本没有使用ViewRouter

最简单的更改是在视图中使用@AppStorage而不是@State,这将在整个发布过程中持续存在。你甚至可以使用你在ViewRouter:中使用的相同密钥

struct ContentView: View {

@AppStorage("didLaunchBefore") private var onboardingDone = false
var data = OnboardingData.data

var body: some View {
Group {

if !onboardingDone {
OnboardingView(data: data, doneFunction: {
self.onboardingDone = true
})
} else {
ScreenView()
}
}
}
}
struct OnboardingView : View {
var data : String
var doneFunction: () -> Void

var body: some View {
Text("onboarding")
Button("Done") {
self.doneFunction()
}
}
}

如果你确实想使用ViewRouter,这里有另一个选择:

class ViewRouter: ObservableObject {
@Published var route : Routes = .initial
@AppStorage("didLaunchBefore") private var didLaunchBefore = false
enum Routes {
case initial, onboarding
}

init() {
if !didLaunchBefore {
didLaunchBefore = true
route = .onboarding
} else {
route = .initial
}
}

func finishOnboarding() {
didLaunchBefore = true
route = .initial
}
}
struct ContentView: View {
@StateObject private var viewRouter = ViewRouter()
var data = OnboardingData.data

var body: some View {
Group {

switch viewRouter.route {
case .initial:
ScreenView()
case .onboarding:
OnboardingView(data: data, doneFunction: {
viewRouter.finishOnboarding()
})
}
}
}
}
struct OnboardingView : View {
var data : String
var doneFunction: () -> Void

var body: some View {
Text("onboarding")
Button("Done") {
self.doneFunction()
}
}
}

最新更新