在SwiftUI中隐藏TabView或创建条件TabView

时间:2020-05-25 00:10:42

标签: swiftui tabview

我的应用程序具有3个标签(读取,发现,配置文件)。在一个从“读取”视图导航到的特定视图中,我想隐藏选项卡视图并显示一个自定义工具栏/选项卡栏,其中将显示操作按钮(例如,保存等)。

我一直在Google搜索和搜索Stack Overflow已有2天,没有运气。这是我所见/尝试过的:

  • 隐藏选项卡视图:似乎使用SwiftUI根本不可能做到这一点。此网站上发布了一些骇客,但它们对我不起作用(例如,尝试使用UITabBarController修改)或太过妥协(例如,在导航视图中包装选项卡视图,导致选项卡视图在所有子视图中消失)
  • 使用根页面:这有效,但是导航视图中断(无法返回上一步按钮)
  • 有条件的选项卡视图:我没有在任何地方看到此消息,但可以尝试一下。我在带有bool状态变量的选项卡视图中尝试了if语句,其中主选项卡(“读取”,“发现”,“配置文件”)设置为默认值,并且在特定的子视图页面上,使用了不同的选项卡视图(例如,使用“保存”纽扣)。但这似乎也不起作用。

有人对工作代码有想法或示例吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我在以下代码中实现了两种解决方案:

  1. 随时更新标签
  2. 转到标签上的特定视图
enum MyTab: String {
    case a, b, c, d

    var view: AnyView {
        switch self {
        case .a, .b: return AnyView(ChildView(page: rawValue))
        case .c, .d: return AnyView(SpecificView())
        }
    }
}

class ViewModel: ObservableObject {

    @Published var tabs: [MyTab] = [.a, .b]
    @Published var selectedTab: MyTab = .a
    @Published var shouldShowTab = true

    var customBinding: Binding<MyTab> {
        Binding(get: {
            self.selectedTab
        }, set: {
            if $0 == .c {
                // save
            } else if $0 == .d {
                // like
            }
            self.selectedTab = $0
        })
    }

    func updateTabs() {
        tabs = [.c, .d]
    }
}

struct ContentView: View {

    @EnvironmentObject var viewModel: ViewModel

    var body: some View {
        Group {
            if viewModel.shouldShowTab {
                TabView(selection: viewModel.customBinding) {
                    ForEach(viewModel.tabs, id: \.self) { tab in
                        tab.view
                            .tabItem { Text(tab.rawValue) }
                    }
                }
            } else {
                SpecificView()
            }
        }
    }
}

struct ChildView: View {

    @EnvironmentObject var viewModel: ViewModel
    var page: String

    var body: some View {
        VStack(spacing: 24) {
            Text("Page: \(page)")
            Button(action: {
                self.viewModel.shouldShowTab = false
            }) {
                Text("Go to Specific View")
            }
            Button(action: {
                self.viewModel.updateTabs()
            }) {
                Text("or update tabs on the go")
            }
        }
    }
}

struct SpecificView: View {

    @EnvironmentObject var viewModel: ViewModel

    var body: some View {
        // Use whatever you'd like tab etc.
        VStack(spacing: 24) {
            Text("My Specific View")
            Button(action: {
                self.viewModel.shouldShowTab = true
            }) {
                Text("Go back to Tab View")
            }
        }
    }
}

答案 1 :(得分:0)

您可以将新视图显示为Sheet,这样您提到的特定视图就可以拥有自己的TabView

struct ContentView: View {

    @State var presentView = false

    var body: some View {
        Button(action: {
            self.presentView.toggle()
        }) {
            Text("Present View")
        }
        .sheet(isPresented: $presentView) {
            TabView {
                // content
            }
        }
    }
}