首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI -移除NavigationView?

SwiftUI -移除NavigationView?
EN

Stack Overflow用户
提问于 2020-08-13 20:22:13
回答 1查看 345关注 0票数 0

我的入职过程的根视图有一个NavigationView。我的应用程序的根视图是一个登录页面,其中也包含一个NavigationView。这意味着,当某人第一次启动应用程序时,他们将经历入职过程,并在登录屏幕上登陆--从而在导航视图中形成导航视图。

是否有一种方法可以重置视图堆栈,或者在必要时只删除额外的导航视图?

下面我就是这样实现@New的解决方案的。首先是塔班。(这个名字帮助我可视化了一个事实,即它是一个ObservableObject。)它的工作是跟踪currentPage并让感兴趣的视图知道它何时发生了变化。

代码语言:javascript
运行
复制
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发生变化时,塔会通知它,并加载相应的视图。

代码语言:javascript
运行
复制
struct ConductorView: View {
@EnvironmentObject var tower: Tower
    var body: some View {
        VStack {
            if tower.currentPage == .onboarding {
                ContentViewA()
            } else if tower.currentPage == .login {
                ContentViewB()
            }
        }
    }
}

最后是一个内容视图。

代码语言:javascript
运行
复制
struct ContentViewA: View {
    @EnvironmentObject var tower: Tower
    var body: some View {
        Button(action: {
            self.tower.currentPage = .login
            }) {
            Text("Go to Login")
            }
        }
    }
}

除了New非常喜欢的解决方案之外,我还使用了来自BLCKBIRDS的这篇文章

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-14 05:47:36

我将详述我的评论。NavigationView/NavigationLink不是更改视图的唯一方法--还可以使用一个简单的条件来确定呈现哪个视图。

因此,比方说,您有一些类包含登录/入职信息的状态:

代码语言:javascript
运行
复制
class AppState: ObservableObject {
   enum UserFlow { 
      case onboarding, login, home
   }
   @Published var userFlow: UserFlow = .onboarding
   // ...
}

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

代码语言:javascript
运行
复制
struct RootView: View {

   @EnvironmentObject var appState: AppState

   var body: some View {
      if appState.userFlow == .onboarding {
         OnboardingRootView()
      } else if appState.userFlow == .login {
         LoginRootView()
      } else {
         ContentView()
      }
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63402688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档