Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SwiftUI中隐藏选项卡视图或创建条件选项卡视图_Swiftui_Tabview - Fatal编程技术网

在SwiftUI中隐藏选项卡视图或创建条件选项卡视图

在SwiftUI中隐藏选项卡视图或创建条件选项卡视图,swiftui,tabview,Swiftui,Tabview,我的应用程序有三个选项卡:读取、发现、配置文件。在从“读取”视图导航到的一个特定视图中,我想隐藏选项卡视图并显示一个自定义工具栏/选项卡栏,该工具栏/选项卡栏将显示操作按钮,例如“保存”,如 我已经在谷歌上搜索了2天的堆栈溢出,但没有运气。这就是我所看到/尝试的: 隐藏选项卡视图:似乎这在SwiftUI中根本不可能实现。此网站上发布了一些攻击,但它们对我不起作用,例如,尝试使用UITabBarController修改或过于妥协,例如,在导航视图中包装选项卡视图,导致选项卡视图在所有子视图中消失

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

我已经在谷歌上搜索了2天的堆栈溢出,但没有运气。这就是我所看到/尝试的:

隐藏选项卡视图:似乎这在SwiftUI中根本不可能实现。此网站上发布了一些攻击,但它们对我不起作用,例如,尝试使用UITabBarController修改或过于妥协,例如,在导航视图中包装选项卡视图,导致选项卡视图在所有子视图中消失 使用根页面:这可以工作,但导航视图断开后无法返回按钮 条件选项卡视图:我没有在任何地方看到这篇文章,但尝试了一下。我在选项卡视图中尝试了一个带有bool状态变量的if语句,其中主选项卡Read、Discover、Profile设置为默认值,并且在特定的子视图页面上,使用了不同的选项卡视图,例如,带有保存按钮。但这似乎也不起作用。
有人有工作代码的想法或示例吗?谢谢

您可以将新视图显示为图纸,这样您提到的特定视图就可以有自己的选项卡视图


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

随时随地更新标签 转到选项卡上的特定视图
请阅读和考虑和感谢,虽然一些具体的反馈将被赞赏的问题是如何改善,因为这是我第一次张贴。如果是因为我没有包含代码,那么指南很清楚,代码不是必需的。还是呢?考虑一个感谢的解决方案吧!这很清楚-我将很快添加可复制的代码。谢谢!如果没有其他办法,那绝对是一个选择。我希望用户在视图中花费相当多的时间,因此,不幸的是,模态方法在该上下文中感觉不正确-感觉更像是一个快速弹出窗口。没问题!你能详细解释一下你想要实现的用户体验吗?我也给了一个新的答案,请看一看。谢谢!这非常有效,并为隐藏或更新选项卡提供了灵活性。谢谢
struct ContentView: View {

    @State var presentView = false

    var body: some View {
        Button(action: {
            self.presentView.toggle()
        }) {
            Text("Present View")
        }
        .sheet(isPresented: $presentView) {
            TabView {
                // content
            }
        }
    }
}
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")
            }
        }
    }
}