SwiftUI-当前入职屏幕/演练
我希望在用户注册后添加/呈现入职屏幕/演练。但是,我已经在我的SwiftUI-当前入职屏幕/演练,swiftui,Swiftui,我希望在用户注册后添加/呈现入职屏幕/演练。但是,我已经在我的SceneDelegate中使用了.environmentObject()。原因是我希望检查用户的身份验证状态(我正在使用FireStore) 这就是我的场景大使: if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHos
SceneDelegate
中使用了.environmentObject()
。原因是我希望检查用户的身份验证状态(我正在使用FireStore)
这就是我的场景大使:
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: InitialView().environmentObject(SessionStore()))
self.window = window
window.makeKeyAndVisible()
}
这是我的初步看法:
struct InitialView: View {
@EnvironmentObject var session: SessionStore
func listen() {
session.listenAuthenticationState()
}
var body: some View {
Group {
if session.isLoggedIn {
MainView()
} else {
SignInView()
}
}.onAppear(perform: listen)
}
}
我的SignInView()
非常简单。我的MainView()
本质上就是我的TabView
struct MainView: View {
var body: some View {
ZStack() {
Color(SYSTEM_BACKGROUND_COLOUR)
.edgesIgnoringSafeArea(.all)
TabView{
HomeView().tabItem({
Image(systemName: "house.fill")
})
DiscoverSearchView().tabItem({
Image(systemName: "magnifyingglass")
})
CameraView().tabItem({
Image(systemName: "camera.fill")
})
ActivityView().tabItem({
Image(systemName: "heart.fill")
})
ProfileView().tabItem({
Image(systemName: "person.crop.circle")
})
}.accentColor(Color(SYSTEM_ACCENT_COLOUR))
}
}
}
所以现在我有了一个初步的观点,但我不太确定如何表达它:
struct OnboardingContentView: View {
@State private var step = 1
var body: some View {
ZStack {
Color(SYSTEM_BACKGROUND_COLOUR)
.edgesIgnoringSafeArea(.all)
VStack {
Text("Welcome to").font(.caption).foregroundColor(Color(SYSTEM_FONT_COLOUR))
.padding(.top)
Text("Anexis").bold().font(.largeTitle).foregroundColor(Color(SYSTEM_FONT_COLOUR))
GeometryReader { gr in
HStack {
VStack(spacing: 40) {
Image("logo")
Text("1")
.padding()
.animation(Animation.interpolatingSpring(stiffness: 40, damping: 7).delay(0.1))
}.frame(width: gr.frame(in: .global).width)
VStack(spacing: 40) {
Image("logo")
Text("2")
.padding().fixedSize(horizontal: false, vertical: true)
.animation(Animation.interpolatingSpring(stiffness: 40, damping: 7).delay(0.1))
}.frame(width: gr.frame(in: .global).width)
VStack(spacing: 40) {
Image("logo")
Text("3")
.padding().fixedSize(horizontal: false, vertical: true)
.animation(Animation.interpolatingSpring(stiffness: 40, damping: 7).delay(0.1))
}.frame(width: gr.frame(in: .global).width)
}.multilineTextAlignment(.center)
.foregroundColor(Color(SYSTEM_FONT_COLOUR)).font(.title).padding(.vertical, 60).frame(width: gr.frame(in: .global).width * 3)
.frame(maxHeight: .infinity)
.offset(x: self.step == 1 ? gr.frame(in: .global).width : self.step == 2 ? 0 : -gr.frame(in: .global).width)
.animation(Animation.interpolatingSpring(stiffness: 40, damping: 8))
}
HStack(spacing: 20) {
Button(action: {self.step = 1}) {
Image(systemName: "1.circle")
.padding().scaleEffect(self.step == 1 ? 1 : 0.65)
}
Button(action: {self.step = 2}) {
Image(systemName: "2.circle")
.padding().scaleEffect(self.step == 2 ? 1 : 0.65)
}
Button(action: {self.step = 3}) {
Image(systemName: "3.circle")
.padding().scaleEffect(self.step == 3 ? 1 : 0.65)
}
}
.animation(.spring(response: 0.4, dampingFraction: 0.5)).font(.largeTitle).accentColor(Color(SYSTEM_ACCENT_COLOUR))
Button(action: {
NavigationView {
HomeView()
}
}) {
HStack {
Text("Continue")
Image(systemName: "chevron.right")
}.padding(.horizontal)
.padding().background(Capsule().fill(Color(SYSTEM_ACCENT_COLOUR))).accentColor(Color(SYSTEM_BACKGROUND_COLOUR)).opacity(step == 3 ? 1 : 0)
.animation(.none).scaleEffect(step == 3 ? 1 : 0.01).animation(Animation.interpolatingSpring(stiffness: 50, damping: 10, initialVelocity: 10))
}
}.padding()
}
}
}
我试图将另一个.environmentObject()
添加到我的SceneDelegate中,但出现了错误。所以我想我可以使用UserDefaults
,但是我得到了一个错误
未找到ViewRouter类型的ObservieObject
那么,我如何检查用户是否第一次安装了该应用程序,显示入职视图,以及如何取消入职视图?单击继续
按钮时,是否使用导航链接
到我的主页视图
编辑:
class ViewRouter: ObservableObject {
@Published var currentPage: String
init() {
if !UserDefaults.standard.bool(forKey: "didLaunchBefore") {
UserDefaults.standard.set(true, forKey: "didLaunchBefore" )
currentPage = "onboardingView"
} else {
currentPage = "homeView"
}
}
}
您可以创建用于布线的顶层视图-有条件地显示视图:
class ViewRouter: ObservableObject {
@Published var currentPage = "onboardingView"
init() {
if !UserDefaults.standard.bool(forKey: "didLaunchBefore") {
UserDefaults.standard.set(true, forKey: "didLaunchBefore")
currentPage = "onboardingView"
} else {
currentPage = "initialView"
}
}
}
您还需要将根视图替换为:
RoutingView()
.environmentObject(SessionStore())
.environmentObject(ViewRouter())
注意:我假设您希望显示InitialView而不是HomeView(因为用户可能未登录)。如果不是这样,您可以轻松地将
InitialView
替换为HomeView
未找到ViewRouter类型的ObserveObject-什么是ViewRouter
?@pawello2222啊,我的错,我添加了我的ViewRouter类。很抱歉。
struct OnboardingView: View {
@EnvironmentObject private var viewRouter: ViewRouter
var body: some View {
VStack {
Text("OnboardingView")
Button("Continue") {
self.viewRouter.currentPage = "initialView"
}
}
}
}
RoutingView()
.environmentObject(SessionStore())
.environmentObject(ViewRouter())