SwiftUI - 删除 NavigationView?
SwiftUI - Removing a NavigationView?
我的入职流程的根视图有一个 NavigationView。我的应用程序的根视图是一个登录页面,其中还包含一个 NavigationView。这意味着当有人首次启动该应用程序时,他们将完成入职流程并登陆登录屏幕 - 从而在导航视图中形成导航视图。
有没有办法重置视图堆栈或在必要时简单地删除额外的导航视图?
这就是我在下面实现@New Dev 解决方案的方式。首先是塔class。 (这个名字帮助我形象化它是一个 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 发生变化时由 Tower 通知,并加载相应的视图。
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 包含 login/onboarding 信息的状态:
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()
}
}
}
我的入职流程的根视图有一个 NavigationView。我的应用程序的根视图是一个登录页面,其中还包含一个 NavigationView。这意味着当有人首次启动该应用程序时,他们将完成入职流程并登陆登录屏幕 - 从而在导航视图中形成导航视图。
有没有办法重置视图堆栈或在必要时简单地删除额外的导航视图?
这就是我在下面实现@New Dev 解决方案的方式。首先是塔class。 (这个名字帮助我形象化它是一个 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 发生变化时由 Tower 通知,并加载相应的视图。
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 包含 login/onboarding 信息的状态:
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()
}
}
}