Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI-当前入职屏幕/演练_Swiftui - Fatal编程技术网

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())