TabView 内的 NavigationView:使用 TabItem-Buttons 时如何到达顶级 TabView

NavigationView inside TabView: How to get to top-level TabView when using the TabItem-Buttons

我有我的 ContentView,这是一个 TabView,带有 View1View2 作为制表符:

struct ContentView: View {
    @State private var selection: Tab = .View1

    enum Tab {
        case View1
        case View2
    }

    var body: some View {
        TabView(selection: $selection) {
            View1()
                .tabItem {
                    Label("View1", systemImage: "")
                }
                .tag(Tab.View1)
                        
            View2()
                .tabItem {
                    Label("View2", systemImage: "")
                }
                .tag(Tab.View2)
        }
    }
}

View1NavigationViewNavigationLink 到子视图:

struct View1: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: Text("Subview1")) {
                Text("Hello, View1!")
            }
        }
    }
}

当我在 View1 的子视图中时,通过选项卡更改为 View2 并(再次通过选项卡)更改回 View1,它会恢复子视图,这很好。我如何通过再次按下 View1 的选项卡 来实现这一点,它让我进入 View1 的顶层(即 View1 与“你好,View1”)。截至目前,我必须使用左上角的 NavigationLink

可能的方法是使用具有副作用的代理绑定来重置具有导航视图的视图,因此git它到初始状态。

使用 Xcode 12.4 / iOS 14.4

准备的演示

struct ContentView: View {
    @State private var selection: Tab = .View1

    // force-reset property
    @State private var reset = UUID()       
    
    enum Tab {
        case View1
        case View2
    }

    var body: some View {

        let proxy = Binding(get: {selection}, set: {
            if selection == [=10=] {
                reset = UUID()     // << update if same tab clicked !!
            }
            selection = [=10=]
        })

        TabView(selection: proxy) {
            View1()
                .tabItem {
                    Label("View1", systemImage: "")
                }
                .tag(Tab.View1)
                .id(reset)        // reset on changed !!
            
            View2()
                .tabItem {
                    Label("View2", systemImage: "")
                }
                .tag(Tab.View2)
        }
    }
}