SwiftUI-删除NavigationView吗?

问题描述

我的入职流程的根视图具有NavigationView。我的应用程序的根视图是一个登录页面,其中还包含一个NavigationView。这意味着当某人首次启动该应用程序时,他们将经历入职过程并进入登录屏幕-从而在导航视图中产生一个导航视图。

是否有必要重置视图堆栈或在必要时删除多余的导航视图?


这就是我在下面实现@New Dev的解决方案的方式。首先是塔类。 (该名称有助于我直观地看到它是一个ObservableObject的事实。)它的工作是跟踪currentPage并在更改时让感兴趣的视图知道。
import Foundation
import SwiftUI
import Combine

class Tower: ObservableObject {
    enum Views {
       case onboarding,login,dashboard
    }
    let objectWillChange = PassthroughSubject<Tower,Never>()
    @Published var currentPage: Views = .onboarding {
        didSet {
            objectWillChange.send(self)
        }
    }
}

接下来是ConductorView。当currentPage更改时,塔会通知它,并加载相应的视图。

struct ConductorView: View {
@EnvironmentObject var tower: Tower
    var body: some View {
        VStack {
            if tower.currentPage == .onboarding {
                ContentViewA()
            } else if tower.currentPage == .login {
                ContentViewB()
            }
        }
    }
}

最后是内容视图。

struct ContentViewA: View {
    @EnvironmentObject var tower: Tower
    var body: some View {
        Button(action: {
            self.tower.currentPage = .login
            }) {
            Text("Go to Login")
            }
        }
    }
}

除了New Devs非常赞赏的解决方案外,我还使用了BLCKBIRDS的this article

解决方法

我将继续评论。 NavigationView / NavigationLink并不是改变视图的唯一方法-一个简单的条件也可以用来确定呈现哪个视图。

例如,您有一些包含登录/入职信息状态的类:

class AppState: ObservableObject {
   enum UserFlow { 
      case onboarding,login,home
   }
   @Published var userFlow: UserFlow = .onboarding
   // ...
}

然后您的RootView可以确定要显示的用户流:

struct RootView: View {

   @EnvironmentObject var appState: AppState

   var body: some View {
      if appState.userFlow == .onboarding {
         OnboardingRootView()
      } else if appState.userFlow == .login {
         LoginRootView()
      } else {
         ContentView()
      }
   }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...