如何在 SwiftUI 中隐藏 TabBar 并保留工具栏项?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中隐藏 TabBar 并保留工具栏项?【英文标题】:How can you hide a TabBar in SwiftUI and retain toolbarItems? 【发布时间】:2021-04-01 16:04:12 【问题描述】:

当从一个视图推送到另一个视图时,我想在 SwiftUI 中隐藏我的 TabView 的 TabBar,就像在消息以外的几乎所有聊天应用程序中一样。

我已经看到了几种使用第三方库的方法,但是我正在寻找一个本地解决方案。

我最接近的是嵌套在 NavigationView 中的 TabView。这似乎工作正常,并且可以设置 NavigationTitle 但是我还没有找到设置工具栏项的方法。

@State var navTitle: String = ""

NavigationView 
    TabView 
        ViewA()
            .tabItem 
                Label("TabA", systemImage: "some.image")
            
        ViewB()
            .tabItem 
                Label("TabB", systemImage: "some.image")
            
        ViewC()
            .tabItem 
                Label("TabC", systemImage: "some.image")
            
    
    .navigationTitle($navTitle) // change nav title in tabbed views

如果我要使用这种方法来确保在 ViewA/B/C 中推送新视图时 tabBar 隐藏,我将如何将 toolBarItems 放置在 ViewA/B/C 的导航栏中的 navigationBarTrailing 中?

我需要这些 toolBarItems 中的按钮可以在 ViewA/B/C 中访问,否则我将在 TabBarView 中创建 viewModels 并传递我想要避免的。

如果只有一种方法可以在推送到另一个视图时隐藏 TabBar,我可以返回将 navigationView 嵌套在 TabView 中,这会使事情变得更容易。

【问题讨论】:

【参考方案1】:

我所做的是一个非常老套的解决方案,但它似乎可以工作,直到他们有办法隐藏 TabBar:

NavigationView 
    TabView 
        ViewA()
            .tabItem 
                Label("TabA", systemImage: "some.image")
            
        ViewB()
            .tabItem 
                Label("TabB", systemImage: "some.image")
            
        ViewC()
            .tabItem 
                Label("TabC", systemImage: "some.image")
            
    
    .navigationBarHidden(true)

然后您可以在每个视图中添加一个 NavigationView。似乎运作良好,但显然不是理想的方法。

【讨论】:

虽然 Swift(现在)是开源的,但不幸的是 SwiftUI 不是。我明白为什么,但仍然。 Swift,目前是 5.3.3,自 WWDC 2020 以来已经更新了 5 次。SwiftUI?我什至不确定 Apple 是否使用版本控制,但假设它是 2.x?我的看法,祝你好运,WWDC 2021 将推出一些不那么俗气的东西。 (我仍然使用 UIKit 仅仅是因为我不关心 Apple Watch 或 Mac 硬件,而且我的应用程序有很多“差距”。)

以上是关于如何在 SwiftUI 中隐藏 TabBar 并保留工具栏项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 的标签栏的特定视图中隐藏导航栏?

如何在 SwiftUI 中垂直居中纯文本 TabBar 按钮?

SwiftUI - TabBar 按钮更改

SwiftUI TabBar 颜色

当新页面被推入颤动时如何隐藏本机Tabbar?

在 TabNavigator 中隐藏 TabBar 项