【问题标题】:NavigationView inside TabView: How to get to top-level TabView when using the TabItem-ButtonsTabView 内的 NavigationView:使用 TabItem-Buttons 时如何到达顶级 TabView
【发布时间】:2021-02-01 16:44:43
【问题描述】:

我有我的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 的子视图中时,通过选项卡更改为View2,然后(再次通过选项卡)更改回View1,它会恢复子视图,这很好。如何通过按View1 的选项卡再次 来实现这一点,它让我到达View1 的顶层(即View1 带有“Hello,View1”)。截至目前,我必须使用左上角的NavigationLink

【问题讨论】:

    标签: swift swiftui navigationview tabview


    【解决方案1】:

    可能的方法是使用具有副作用的代理绑定来重置具有导航视图的视图,因此将其 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 == $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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2021-07-18
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多