在NavigationView中的SwiftUI视图之间进行切换

时间:2020-01-29 17:16:57

标签: swiftui ios13 lottie ios-navigationview

今天,我试图在2个不同的视图之间导航,但是我想使用相同的视图来清除前一个视图中的信息。我创建了一个MotherView来调用2个不同的视图。这是我的代码

import SwiftUI

struct MotherView: View {
    @ObservedObject var viewRouter: ViewRouter

    var body: some View {

        VStack {
            if viewRouter.currentPage == "splash" {
                SplashView()
            } else{
                ContentView()
            }
        }
    }
}


struct MotherView_Previews : PreviewProvider {
    static var previews: some View {
        MotherView(viewRouter: ViewRouter())
    }
}

这是我的SplashScreen:

    struct SplashView: View {
    @State private var isAnimated = true
    @EnvironmentObject var pageSettings: PageSettings

    var body: some View {
            VStack{

                LottieView(filename:"Logo")
                pageSettings.currentPage = "content"
            }
    }


}

注意SplashView()是带有使用Lottie的动画的视图,而ContentView()是具有我的登录信息的视图。我想使用SplashView()启动我的应用程序,然后清理VStack并运行ContentView()。

有可能吗?谢谢!

这是此代码的最新更新(我收到此错误:“参数类型'()'与预期的类型'视图'不符”)

    struct SplashView: View {
    @State private var animated = false
    @EnvironmentObject var pageSettings: PageSettings
    var body: some View {
        VStack{
            if self.animated{
                pageSettings.currentPage = "content"
            }else{
                LottieView()
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我使用类似的技术显示登录视图,然后在用户登录后显示内容视图。这是您可以实现的一种方法:

创建一个ObservableObject

class pageSettings: ObservableObject {
    @Published var currentPage: String = "splash"
}

修改您的SceneDelegate

var window: UIWindow?之后添加以下行:

var pageSettings = PageSettings()

然后替换UIHostingController的调用:

window.rootViewController = UIHostingController(rootView: contentView)

通过此呼叫:

window.rootViewController = UIHostingController(rootView: contentView.environmentObject(pageSettings))

使用您的ObservableObject

在您的MotherView内,添加以下属性:

@EnvironmentObject var pageSettings: PageSettings

以此替换您的测试:

if pageSettings.currentPage == "splash" 

在您的SplashScreen内部

您还需要致电EnvironmentObject。然后,您可以像这样更新currentPage的值(它将立即切换视图):

pageSettings.currentPage = "content"

您可以使用环境对象在所有视图之间传递数据。