ios - 使用 NavigationLink 打开新 View 时如何隐藏 TabView?

标签 ios swiftui swiftui-navigationlink swiftui-navigationview swiftui-tabview

假设我们有一个 SwiftUI View 包含

struct ContentView: View {
    var body: some View {
        TabView {
            FirstView().tabItem {
                // tabItem image and text
            }
            SecondView().tabItem {
                // tabItem image and text
            }
        }
    }
}

现在,假设 FirstView 包含一个带有可滚动内容的 NavigationView,每个元素都使用 NavigationLink。我怎样才能让它在触发 NavigationLink 目的地时(即打开 subview ),它接管整个页面(全屏),从而隐藏 TabView ?

理想情况下,我希望支持 iOS 13+。

我已尝试按照 Hacking with Swift 上的指导进行操作但无济于事。

我也遵循了 SwiftUI Hide TabView bar inside NavigationLink views 中的建议但发现顶级解决方案的性能不是很好,所以我希望实现一个没有延迟出现的解决方案。

最佳答案

tabitem 的内容包含在检查共享状态的 if 条件中:

struct ContentView: View {

    @StateObject private var state = State()

    var body: some View {
        TabView {
            FirstView().tabItem {
                if !state.hideTabView {
                    // tabItem image and text
                }
            }
            SecondView().tabItem {
                if !state.hideTabView {
                    // tabItem image and text
                }
            }
        }
        .environmentObject(state)
    }
}

State 是一个 ObservableObject:

class State: ObservableObject {
    @Published hideTabView: Bool = false
}

然后您可以在通过 NavigationLink 链接到的 View 上使用 onAppear(例如在 FirstView 中):

struct FirstView: View {
    
    @EnvironmentObject private var state: State
    var body: some View {
        VStack {
            // ... some content
        }
        .onAppear(perform: { state.hideTabView = true })
        .onDisappear(perform: { state.hideTabView = false })
    }
}

当您按下“< Back”时,TabView 会稍有延迟,如果这真的困扰您,那么您可以制作一个自定义的 Back 按钮并将此 state.hideTabView = false 移动到点击该按钮的事件。

这是我能想到的一种方法 :) 此外,您可能会发现 this thread有帮助。

关于ios - 使用 NavigationLink 打开新 View 时如何隐藏 TabView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64414483/

相关文章:

ios - ScrollView 导航链接在 VStack 和 GeometryReader、XCode12、beta 4 中仍然处于事件状态

ios - 使用 iOS 后台传输服务下载多个文件

ios - 如何拥有多个带标题的 UICollectionView 并使其水平滑动

ios - Swift 包中 SwiftUI 热重载的 "noWorkspaceArena"错误

ios - 尝试重新访问之前在 SwiftUI 中单击的 NavigationLink 时,NavigationLink 卡住

ios - 在 NavigationLink 中设置 editMode 时,SwiftUI EditButton() 不起作用

ios - UIPickerView 崩溃

ios - Core Data 中如何有效处理大数据集?

swift - 关于将数组与 State 属性一起使用的问题

swift - 如何在执行 navigationLink 之前执行操作