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

时间:2021-02-01 16:44:43

标签: swift swiftui navigationview tabview

我有我的 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)
        }
    }
}

View1 是带有 NavigationView 到子视图的 NavigationLink

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

当我在 View1 的 SubView 中时,通过选项卡更改为 View2 并更改回(再次通过选项卡)为 View1,它恢复子视图,即美好的。我怎样才能通过按 View1 again 的标签来实现这一点,它让我进入 View1 的顶级(即 View1 与“Hello, View1 ”)。截至目前,我必须使用左上角的 NavigationLink

1 个答案:

答案 0 :(得分:3)

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

使用 Xcode 12.4 / iOS 14.4 准备的演示

demo

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 == $0 {
                reset = UUID()     // << update if same tab clicked !!
            }
            selection = $0
        })

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