在SwiftUI中单击NavigationLink后隐藏TabView

时间:2019-09-23 17:26:09

标签: ios swift swiftui

当我有一个TabView{}并且第一个标签页有一个NavigationView时,当我单击Row时,我希望该TabView{}消失。我该怎么办?

此处是同一期杂志:How to hide the TabBar when navigate with NavigationLink in SwiftUI?

但不幸的是没有解决办法。

3 个答案:

答案 0 :(得分:1)

为解决此限制,我提出了这种方法:

  • 创建了一个枚举来标识选项卡
enum Tabs: Int {
    case tab1
    case tab2
    
    var title: String {
        switch self {
        case .tab1: return "Tab 1 Title"
        case .tab2: return "Tab 2 Title"
        }
    }

    var imageName: String {
        switch self {
        case .tab1: return "star" // Example using SF Symbol
        case .tab2: return "ellipsis.circle"
        }
    }
}
  • 在视图中,例如ContentView.swift,添加了这样的属性:
@State private var selectedTab = Tabs.tab1
  • 体内:
NavigationView {
    TabView(selection: $selectedTab) {
        ViewExample1()
            .tabItem {
                Image(systemName: Tabs.tab1.imageName)
                Text(Tabs.tab1.title)
        }.tag(Tabs.tab1)
        
        ViewExample2()
            .tabItem {
                Image(systemName: Tabs.tab2.imageName)
                Text(Tabs.tab2.title)
        }.tag(Tabs.tab2)
    }
    .navigationBarTitle(selectedTab.title)
}

仅此而已。我希望这会有所帮助。

注意:请注意,该解决方法会将TabView隐藏在所有子视图中,如果您只想隐藏在特定视图中,则不会得到您想要的结果

希望苹果公司实现了一个(官方的和适当的)选项,以便尽快隐藏TabView。

答案 1 :(得分:0)

目前无法执行此操作。例如,NavigationView对其后代响应.navigationBarHidden(_:)方法,但是TabView没有等效方法。

如果您要查看此内容,请https://sqlite.org/fts5.html#external_content_tables

答案 2 :(得分:0)

无法隐藏TabView,因此我必须在ZStack中添加TabView,如下所示:

var body: some View {
    ZStack {
        TabView {
            TabBar1().environmentObject(self.userData)
                .tabItem {
                    Image(systemName: "1.square.fill")
                    Text("First")
            }
            TabBar2()
                .tabItem {
                    Image(systemName: "2.square.fill")
                    Text("Second")
            }
        }

        if self.userData.showFullScreen {
            FullScreen().environmentObject(self.userData)

        }
    }
}

UserData:

  final class UserData: ObservableObject {
    @Published var showFullScreen = false}

TabBar1:

struct TabBar1: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        Text("TabBar 1")
            .edgesIgnoringSafeArea(.all)
            .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
            .background(Color.green)
            .onTapGesture {
                self.userData.showFullScreen.toggle()
        }
    }
}

全屏:

struct FullScreen: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        Text("FullScreen")
            .edgesIgnoringSafeArea(.all)
            .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
            .background(Color.red)
            .onTapGesture {
                self.userData.showFullScreen.toggle()
        }
    }
}

检查Github上的完整代码

还有其他一些方法,但这取决于视图的结构