如何在SwiftUI中使用NavigationLink进行导航时隐藏TabBar?

26

我有一个包含两个选项卡的TabView,每个选项卡都包含一个NavigationView。当导航到另一个视图时,我需要隐藏TabBar。其中一种解决方案是将TabView放置在一个NavigationView内部,但我必须为每个NavigationView设置不同的属性。

TabView(selection: $selectedTab, content: {
            NavigationView {
                VStack {
                    NavigationLink(destination: Text("SecondView Tab1")) {
                        Text("Click")
                    }
                }
            }.tabItem {
                Text("ONE")
            }.tag(0)

            NavigationView {
                VStack {
                    NavigationLink(destination: Text("SecondView Tab2")) {
                        Text("Click")
                    }
                }
            }.tabItem {
                Text("TWO")
            }.tag(1)

        })

附言:我正在使用Xcode 11 Beta 5


请查看 https://github.com/smartvipere75/bottombar-swiftui - DogCoffee
我在这里发布了解决此限制的一种方法:https://dev59.com/SLbna4cB1Zd3GeqPbn7R#62908095 - Rod
3个回答

27

稍晚一些但它会起作用,将你的NavigationView放在TabView之前,当你在选项卡视图中使用导航链接时,选项卡按钮将会被隐藏。

NavigationView{
    TabView{
        ...
    }
}

我找到的最佳答案 - kingnight
8
这会带来意想不到的后果。 https://dev59.com/P73pa4cB1Zd3GeqPenVZ - daihovey
iOS17之后不再有效。 - undefined

1
我有同样的问题; 我采取了以下措施来解决这个问题:
  1. 使用NavigationView包含TabView隐藏NavigationBar
  2. 创建一个自定义的NavigationView,如下所示
  3. 在下一个视图中仍然隐藏NavigationBar
// root tab
NavigationView {
    TabView {
        // some
    }
    .navigationBarTitle(xxx, displayMode: .inline)
    .navigationBarHidden(true)
}

// custom navigation view
@available(iOS 13.0.0, *)
struct MyNavigationView: View {
    var body: some View {
        HStack {
            Spacer()
            Text(some)
            Spacer()
        }
        .frame(height: 44)
    }
}

// this view 
VStack {
                MyNavigationView()
                Image(some)
                    .resizable()
                    .frame(width: 100, height: 100, alignment: .top)
                    .padding(.top, 30)
                Spacer()
                HStack {
                    ClockView()
                    Spacer()
                    NavigationLink(
                        destination: DynamicList(),
                        label: {
                            Image(some)
                        }).navigationBarHidden(true)
                }
                .padding(EdgeInsets(top: 0, leading: 15, bottom: 0, trailing: 15))
                
                Spacer()
            }

// next view
var body: some View {
            VStack {
                List {
                    MyNavigationView()
                    ForEach(date, id: \.self) { model in
                        Text(model)
                    }
                }
                .navigationBarHidden(true)
                .navigationBarTitle(some, displayMode: .inline)
            }
    }

-2
据我所知,如果您的导航视图被列为子级,您无法隐藏选项卡栏。您的选项卡栏包含您的导航视图。

3
我自己没有给这个投票踩的,但我猜测这个被踩是因为这个选项在UIKit中可用,所以这个行为应该在SwiftUI中也可用。 - lewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接