在 SwiftUI 中隐藏 TabView 或创建条件 TabView
Hide TabView or create conditional TabView in SwiftUI
我的应用程序有 3 个选项卡(阅读、发现、个人资料)。在从阅读视图导航到的一个特定视图中,我想隐藏选项卡视图并显示一个自定义 toolbar/tab 栏,该栏将显示操作按钮(例如,保存、点赞)。
我已经用谷歌搜索和搜索 Stack Overflow 两天了,但没有成功。这是我见过/尝试过的:
- 隐藏选项卡视图:似乎这在 SwiftUI 中是不可能的。这个网站上发布了一些 hack 但它们对我不起作用(例如,尝试使用 UITabBarController 修改)或过于妥协(例如,在导航视图中包装选项卡视图导致选项卡视图在所有子视图中消失)
- 使用根页面:这可行,但导航视图会中断(无法返回按钮)
- 有条件的选项卡视图:我没有在任何地方看到这个帖子,但试了一下。我在带有 bool 状态变量的选项卡视图中尝试了一个 if 语句,其中主要选项卡(读取、发现、配置文件)设置为默认值,并且在特定的子视图页面上,使用了不同的选项卡视图(例如,使用保存纽扣)。但这似乎也行不通。
有人有工作代码的想法或示例吗?谢谢!
您可以将新视图显示为 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
}
}
}
}
我在下面的代码中实现了两个解决方案:
- 随时随地更新标签
- 转到选项卡上的特定视图
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")
}
}
}
}
我的应用程序有 3 个选项卡(阅读、发现、个人资料)。在从阅读视图导航到的一个特定视图中,我想隐藏选项卡视图并显示一个自定义 toolbar/tab 栏,该栏将显示操作按钮(例如,保存、点赞)。
我已经用谷歌搜索和搜索 Stack Overflow 两天了,但没有成功。这是我见过/尝试过的:
- 隐藏选项卡视图:似乎这在 SwiftUI 中是不可能的。这个网站上发布了一些 hack 但它们对我不起作用(例如,尝试使用 UITabBarController 修改)或过于妥协(例如,在导航视图中包装选项卡视图导致选项卡视图在所有子视图中消失)
- 使用根页面:这可行,但导航视图会中断(无法返回按钮)
- 有条件的选项卡视图:我没有在任何地方看到这个帖子,但试了一下。我在带有 bool 状态变量的选项卡视图中尝试了一个 if 语句,其中主要选项卡(读取、发现、配置文件)设置为默认值,并且在特定的子视图页面上,使用了不同的选项卡视图(例如,使用保存纽扣)。但这似乎也行不通。
有人有工作代码的想法或示例吗?谢谢!
您可以将新视图显示为 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
}
}
}
}
我在下面的代码中实现了两个解决方案:
- 随时随地更新标签
- 转到选项卡上的特定视图
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")
}
}
}
}