【问题标题】:Change between views on SwiftUI within NavigationView在 NavigationView 中的 SwiftUI 视图之间切换
【发布时间】:2020-01-29 17:16:57
【问题描述】:

今天我试图在 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())
    }
}

这是我的启动画面:

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

这可能吗?谢谢!

这是此代码的最后一次更新(我收到此错误:“Argument type '()' does not conform to expected type 'View'”)

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

【问题讨论】:

    标签: swiftui ios13 lottie ios-navigationview


    【解决方案1】:

    我使用类似的技术来显示登录视图,然后在用户登录后显示内容视图。您可以通过以下方式实现:

    创建一个 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"
    

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

    【讨论】:

    • 非常感谢您对我的帮助!我的 SplashScreen 中出现此错误:'()' 不能转换为 'String'
    • 我可以使用 .onAppear() 方法和你自己的逻辑来解决这个问题。非常感谢
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2020-03-27
    • 2020-08-29
    • 1970-01-01
    相关资源
    最近更新 更多