【问题标题】:How can I Hide TabBar in specific Views, in iOS 15 using SwiftUI如何在 iOS 15 中使用 SwiftUI 在特定视图中隐藏 TabBar
【发布时间】:2021-12-15 17:46:44
【问题描述】:

如果我点击NavigationLink,我需要我的TabBar 消失。 我知道您可以使用以下代码在 iOS 14 中实现这一点:

 NavigationView{
        TabView{
            View1().tabItem {
                Image(systemName: "house.fill")
                Text("Home")
            }
        }
    }

还有View1:

struct View1: some View {
var body: some View {
    NavigationView{
        NavigationLink(destination: Text("New Page without the Tabbar")) {
            Text("Link")
        }
    }
}
}

但不知何故,这在 iOS 15 中不起作用...... 还有其他解决方法吗?

【问题讨论】:

  • 您可以使用fullScreenCoversheet 来代替NavigationLink 来显示目的地吗?为什么要对抗系统?

标签: swiftui tabbar navigationview ios15


【解决方案1】:

这取决于你想做什么,但你现在应该看 Apple 的观点,他们不鼓励这种做法。

当人们导航到不同的区域时,避免隐藏标签栏 你的应用程序。标签栏是您应用的全局导航控件,因此 确保它始终可见。例外是一个标签栏 模态视图。因为模态视图给人们一个单独的体验 他们完成后关闭,隐藏视图的标签栏 不影响应用导航。

https://developer.apple.com/design/human-interface-guidelines/ios/bars/tab-bars/

您可能会遇到使用此设置获得批准的问题。

您可以在选择更改时触发视图中的更改

struct FakeTabView2: View {
    @State var selection: FakeTabView2.Tabs = .view2
    @State var visible: Bool = false
    var body: some View {
        NavigationView{
            VStack{
                if selection.isTabBarVisible(selection: selection){
                    TabView(selection: $selection){
                        Text("")
                            .tabItem {
                                Image(systemName: FakeTabView2.Tabs.view1.systemImageName())
                                Text(FakeTabView2.Tabs.view1.rawValue)
                            }.tag(FakeTabView2.Tabs.view1)
                        FakeTabViewView2()
                            .tabItem {
                                Image(systemName: FakeTabView2.Tabs.view2.systemImageName())
                                Text(FakeTabView2.Tabs.view2.rawValue)
                            }.tag(FakeTabView2.Tabs.view2)
                    }
                }else{
                    switch selection{
                    case .view1:
                        FakeTabViewView1()
                    default:
                        EmptyView()
                    }
                }
            }
            //Unique title based on selection
            .navigationTitle(selection.rawValue)
        }
    }
    
    enum Tabs: String, CaseIterable{
        case view1 = "Home"
        case view2
        
        func isTabBarVisible(selection: Tabs) -> Bool{
            var result = true
            switch selection{
            case .view1:
                result = false
            default:
                result = true
            }
            return result
        }
        
        func systemImageName() -> String{
            switch self {
            case .view1:
                return "house.fill"
            case .view2:
                return "person"
            }
        }
        
    }
}

【讨论】:

    【解决方案2】:

    您可以尝试只使用一个NavigationView,如下例所示:

    import SwiftUI
    
    @main
    struct TestApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
    struct ContentView: View {
        var body: some View {
            NavigationView {
                TabView {
                    View1().tabItem {
                        Image(systemName: "house.fill")
                        Text("Home")
                    }
                }
            }
        }
    }
    
    struct View1: View {
        var body: some View {
            // ---> here no NavigationView
            NavigationLink(destination: Text("New Page without the Tabbar")) {
                Text("Link")
            }
        }
    }
    

    【讨论】:

    • 使用提供的代码,答案对我来说效果很好,当我点击 NavigationLink 时,TabBar 消失了,这就是 ios 15 的问题。在 ios 15 和 macCatalyst 12 上进行了真实测试设备,使用 macOS 12.1 beta、Xcode 13.1。这对某人不起作用吗?或者为什么投反对票?
    • 有一个问题:每个 NavigationView 只能设置一个 Navigationtitle。这意味着如果 TabBar 包含 3 个选项卡,则它们都具有相同的标题/工具栏。
    • 正如@Max 所说,如果 TabBar 有多个具有不同标题的不同选项卡,这将不起作用:(
    • 嗯,这里有点糊涂,@Max 说的是...one Navigationtitle per NavigationView..,而你说的是TabBar has multiple different Tabs with Different Headings。您能否向我们展示一个示例代码,用您需要的功能复制您的问题。
    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2021-03-26
    • 1970-01-01
    • 2019-10-22
    • 2017-06-15
    相关资源
    最近更新 更多