swift - TabView内的NavigationView : How to get to top-level TabView when using the TabItem-Buttons

标签 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 是一个带有 NavigationLink 到 subview 的 NavigationView:

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

当我位于 View1 的 subview 中时,通过选项卡更改为 View2 并更改回(再次通过选项卡)为 View1 >,它恢复了 subview ,这很好。如何通过再次按下 View1 的选项卡来实现这一点,它可以让我到达 View1 的顶层(即 View1 与“你好,View1”)。截至目前,我必须使用左上角的 NavigationLink

最佳答案

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

关于swift - TabView内的NavigationView : How to get to top-level TabView when using the TabItem-Buttons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65996670/

相关文章:

swift - 如何防止短背景计时器漂移?

ios - 详细 View 中的 TableView 在原型(prototype)单元格上方有空白

SwiftUI 搜索栏与导航栏一致

swiftui - 在 SwiftUI 中推送到另一个屏幕时如何隐藏 NavigationView

swift - map View 在交互上显示白色叠加

ios - 从关系中解析获取对象

ios - 使用 Diffie Hellman key 交换和椭圆曲线加密进行快速加密

swift - 如何将完成 block 添加到 SwiftUI .alert(isPresented)

ios - SwiftUI 图片不会更新

android - listPreferredItemHeightSmall 不适用于 api 16