如何在项目中组织我的代码,以便我可以轻松地从应用程序的每个位置更改根视图?
是否可以在
@main struct MyApp: App { ... }
内部执行此操作,或者我需要创建额外的中间 RootView 结构?
找到了一个没有任何额外内容的解决方案(例如 RootView 结构)。 我这里有 3 个屏幕的示例项目,所有屏幕都可以通过 NavigationManager 从
App
结构切换 rootView。
主要应用程序结构:
@main
struct SwiftUI_TestApp: App {
@StateObject var navigationManager: NavigationManager
init() {
_navigationManager = StateObject(wrappedValue: NavigationManager(rootScreen: .main))
}
var body: some Scene {
WindowGroup {
switch navigationManager.rootScreen {
case .content:
ContentView()
.environmentObject(navigationManager)
case .main:
MainView()
.environmentObject(navigationManager)
case .settings:
SettingsView()
.environmentObject(navigationManager)
}
}
}
}
NavigationManager 类:
final class NavigationManager: ObservableObject {
enum Screen: Hashable {
case main
case content
case settings
}
@Published var rootScreen: Screen
init(rootScreen: Screen) {
self.rootScreen = rootScreen
}
}
ContentView结构:
struct ContentView: View {
@EnvironmentObject var navigationManager: NavigationManager
var body: some View {
VStack {
Text("Content")
Button {
navigationManager.rootScreen = .main
} label: {
Text("Show Main")
}
Button {
navigationManager.rootScreen = .settings
} label: {
Text("Show Settings")
}
}
}
}
主视图结构:
struct MainView: View {
@EnvironmentObject var navigationManager: NavigationManager
var body: some View {
VStack {
Text("Main")
Button {
navigationManager.rootScreen = .content
} label: {
Text("Show Content")
}
Button {
navigationManager.rootScreen = .settings
} label: {
Text("Show Settings")
}
}
}
}
SettingsView结构:
struct SettingsView: View {
@EnvironmentObject var navigationManager: NavigationManager
var body: some View {
VStack {
Text("Settings")
Button {
navigationManager.rootScreen = .content
} label: {
Text("Show Content")
}
Button {
navigationManager.rootScreen = .main
} label: {
Text("Show Main")
}
}
}
}