如何在SwiftUI中的所有其他视图之上显示新屏幕?

时间:2020-10-04 15:04:53

标签: swiftui

当我按下按钮时,我想在所有视图的顶部显示一个新的“视图/场景”(不确定哪个最好)。我目前有一个包含多层的项目,如下所示:

ContentView.swift

var body: some View {
    NavigationView{
        TabView(selection: $selection){
            PractiseMain()
                .tabItem {
                    Image(systemName: "pencil")
                }
            TestMain()
                .tabItem {
                    Image(systemName: "clock")
                }
...

MyApp.swift

var body: some Scene {
    WindowGroup {
        RoutingView().environmentObject(sceneOnDisplay)
    }
...

struct RoutingView: View {
    @EnvironmentObject var sceneOnDisplay: SceneOnDisplay
    let persistenceController = PersistenceController.shared
    
    var body: some View {
        switch sceneOnDisplay.scene {
        case 1:
            PractiseSceneView().transition(.scale)
        default:
            ContentView().environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
        
    }
}

当前,我通过替换RoutingView中的根视图来显示新屏幕,当应用内的按钮更改sceneOnDisplay.scene时,我们将更改视图。从长远来看,我不确定这是否是个好主意。如果我有10个不同的屏幕,那么我不希望每个视图同时存在。

我尝试使用NavigationView,但这仅适用于显示子视图,而不能显示其父视图之外的视图。我要复制的行为与在Android中启动新的activity相同。

1 个答案:

答案 0 :(得分:0)

您可以使用ZStack

struct RoutingView: View {
    @EnvironmentObject var sceneOnDisplay: SceneOnDisplay
    let persistenceController = PersistenceController.shared
    
    var body: some View {
        ZStack {
            mainView
                .zIndex(1)
            if showOverlay { // this can be some environment variable (similar to `sceneOnDisplay`)
                Text("Overlay")
                    .zIndex(2)
            }
        }
    }

    var mainView: some View {
        switch sceneOnDisplay.scene {
        case 1:
            PractiseSceneView().transition(.scale)
        default:
            ContentView().environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
        
    }
}