【问题标题】:How to present a View without embedding it into a current navigation flow in SwiftUI?如何呈现视图而不将其嵌入到 SwiftUI 中的当前导航流中?
【发布时间】:2021-05-13 10:10:45
【问题描述】:

我正在完成一个登录登录,我需要展示一个 HomeView,它对以前的导航流程一无所知。

var body: some View {
    if viewModel.isValidated {
       destination()
    } else {
       LoadingView()
    }

这样做我在destination() 的顶部有一个导航栏。我想我可以隐藏它,但它仍然是相同的导航流程,我需要开始一个新的。我怎样才能做到这一点?(iOS 13)

【问题讨论】:

标签: ios swift swiftui navigationview


【解决方案1】:

处理此问题的一种方法是使用从 BaseViewModel 创建的 @Environment 对象。其工作方式本质上是从BaseView 或视图控制器控制呈现视图的状态。我会尽力为您简化它。

class BaseViewModel: ObservableObject {
    @Published var baseView: UserFlow = .loading

    init() {
         //Handle your condition if already logged in, change 
         //baseView to whatever you need it to be. 
    }
    
    enum UserFlow {
        case loading, onboarding, login, home
    }
}

设置好 BaseViewModel 后,您将要使用它,我在 switch 语句中使用它并绑定到 @EnvironmentObject,以便可以从任何其他视图更改它。

struct BaseView: View {
    @EnvironmentObject var appState: BaseViewModel
    
    var body: some View {
        Group {
            switch appState.userFlow {
            case .loading:
                LoadingView()
            case .onboarding:
                Text("Not Yet Implemented")
            case .login:
                LandingPageView()
            case .home:
                BaseHomeScreenView().environmentObject(BaseHomeScreenViewModel())
            }
        }
    }
}

您的使用情况(可能在您的注册/登录流程结束时)看起来像这样。

struct LoginView: View {

@EnvironmentObject var appState: BaseViewModel

    var body: some View {
        Button(action: {appState = .home}, label: Text("Log In"))
    }
}

所以本质上,这里发生的事情是您将应用程序流存储在一个永远不会被丢弃的特定视图中。把它想象成一个容器。每当您更改它时,它都会更改您要呈现的特定视图。这样做的特别好处是,如果需要,您可以在不使用导航链接的情况下构建单独的导航层次结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2023-03-23
    • 2020-03-16
    相关资源
    最近更新 更多