我是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()
}
}
}