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