使用 NavigationLink 打开新视图时如何隐藏 TabView?

Posted

技术标签:

【中文标题】使用 NavigationLink 打开新视图时如何隐藏 TabView?【英文标题】:How to hide TabView when opening a new view with NavigationLink? 【发布时间】:2021-02-01 11:17:51 【问题描述】:

假设我们有一个 SwiftUI 视图包含

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

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

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

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

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

【问题讨论】:

这可能对你有帮助:***.com/a/63117839/8697793 【参考方案1】:

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)
    

其中StateObservableObject,例如:

class State: ObservableObject 
    @Published hideTabView: Bool = false

然后您可以在通过NavigationLink 链接到的视图上使用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 )
    

当您按下“state.hideTabView = false 移动到点击该按钮的事件中。

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

【讨论】:

【参考方案2】:

一种解决方案是从您的子视图(FirstView 和 SecondView)中删除您的 NavigationView,并在您的 TabView 之外放置一个 NavigationView

NavigationView 
    TabView 
        //...
    

这会将您的TabView 适当地放入导航堆栈中,而不是将其作为导航堆栈的父级。这可能会产生不良结果,包括导航栏标题和 UI 更改,因为您将导航堆栈的根向上游移动,但这适用于我的用例。

【讨论】:

以上是关于使用 NavigationLink 打开新视图时如何隐藏 TabView?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 在 NavigationLink 视图中隐藏 TabView 栏

NavigationLink SwiftUI 中的三元运算符

JWT:当用户打开新标签时如何处理 GET 请求?

JWT:当用户打开新标签时如何处理 GET 请求?

SwiftUI 如何在新视图中链接 ForEach 索引和照片索引?

SwiftUI 无法使用 navigationLink 来回导航