如何更改 SwiftUI 中的根视图(没有 UIHostingController)?

问题描述 投票:0回答:1

如何在项目中组织我的代码,以便我可以轻松地从应用程序的每个位置更改根视图?

是否可以在

@main struct MyApp: App { ... }
内部执行此操作,或者我需要创建额外的中间 RootView 结构?

ios swift swiftui navigation rootview
1个回答
0
投票

找到了一个没有任何额外内容的解决方案(例如 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")
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.