我的入职过程的根视图有一个NavigationView。我的应用程序的根视图是一个登录页面,其中也包含一个NavigationView。这意味着,当某人第一次启动应用程序时,他们将经历入职过程,并在登录屏幕上登陆--从而在导航视图中形成导航视图。
是否有一种方法可以重置视图堆栈,或者在必要时只删除额外的导航视图?
下面我就是这样实现@New的解决方案的。首先是塔班。(这个名字帮助我可视化了一个事实,即它是一个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非常喜欢的解决方案之外,我还使用了来自BLCKBIRDS的这篇文章。
发布于 2020-08-14 05:47:36
我将详述我的评论。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()
}
}
}
https://stackoverflow.com/questions/63402688
复制相似问题