【问题标题】:Hide TabView or create conditional TabView in SwiftUI在 SwiftUI 中隐藏 TabView 或创建条件 TabView
【发布时间】:2020-05-25 00:10:42
【问题描述】:

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

我已经用谷歌搜索和搜索 Stack Overflow 2 天了,但没有运气。这是我看到/尝试过的:

  • 隐藏选项卡视图:似乎这在 SwiftUI 中根本不可能。该网站上发布了一些 hack,但它们对我不起作用(例如,尝试使用 UITabBarController 修改)或过于妥协(例如,在导航视图中包装标签视图,导致标签视图在所有子视图中消失)李>
  • 使用根页面:这可行,但导航视图会中断(无法返回按钮)
  • 有条件的标签视图:我没有在任何地方看到此贴,但试了一下。我在选项卡视图中尝试了一个带有布尔状态变量的 if 语句,其中主选项卡(读取、发现、配置文件)设置为默认值,并且在特定的子视图页面上,使用了不同的选项卡视图(例如,使用 Save纽扣)。但这似乎也行不通。

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

【问题讨论】:

标签: swiftui tabview


【解决方案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")
            }
        }
    }
}

【讨论】:

  • 非常感谢您!这很好用,并且可以灵活地隐藏或更新选项卡。谢谢!
【解决方案2】:

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

【讨论】:

  • 谢谢!如果没有其他办法,这绝对是一个选择。我希望用户在视图中花费相当多的时间,因此不幸的是,模态方法在这种情况下感觉不正确 - 感觉更像是一个快速弹出。
  • 没问题!您能否更详细地解释您想要实现的用户体验?我也给出了新的答案,请看一下。
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 2020-05-09
  • 2021-03-27
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多