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

Hide TabView or create conditional TabView in SwiftUI

我的应用程序有 3 个选项卡(阅读、发现、个人资料)。在从阅读视图导航到的一个特定视图中,我想隐藏选项卡视图并显示一个自定义 toolbar/tab 栏,该栏将显示操作按钮(例如,保存、点赞)。

我已经用谷歌搜索和搜索 Stack Overflow 两天了,但没有成功。这是我见过/尝试过的:

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

您可以将新视图显示为 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
            }
        }
    }
}

我在下面的代码中实现了两个解决方案:

  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 [=10=] == .c {
                // save
            } else if [=10=] == .d {
                // like
            }
            self.selectedTab = [=10=]
        })
    }

    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")
            }
        }
    }
}