假设我们有一个 SwiftUI View 包含
struct ContentView: View {
var body: some View {
TabView {
FirstView().tabItem {
// tabItem image and text
}
SecondView().tabItem {
// tabItem image and text
}
}
}
}
现在,假设 FirstView
包含一个带有可滚动内容的 NavigationView
,每个元素都使用 NavigationLink
。我怎样才能让它在触发 NavigationLink
目的地时(即打开 subview ),它接管整个页面(全屏),从而隐藏 TabView
?
理想情况下,我希望支持 iOS 13+。
我已尝试按照 Hacking with Swift 上的指导进行操作但无济于事。
我也遵循了 SwiftUI Hide TabView bar inside NavigationLink views 中的建议但发现顶级解决方案的性能不是很好,所以我希望实现一个没有延迟出现的解决方案。
最佳答案
将 tabitem
的内容包含在检查共享状态的 if 条件中:
struct ContentView: View {
@StateObject private var state = State()
var body: some View {
TabView {
FirstView().tabItem {
if !state.hideTabView {
// tabItem image and text
}
}
SecondView().tabItem {
if !state.hideTabView {
// tabItem image and text
}
}
}
.environmentObject(state)
}
}
State
是一个 ObservableObject
:
class State: ObservableObject {
@Published hideTabView: Bool = false
}
然后您可以在通过 NavigationLink
链接到的 View 上使用 onAppear
(例如在 FirstView
中):
struct FirstView: View {
@EnvironmentObject private var state: State
var body: some View {
VStack {
// ... some content
}
.onAppear(perform: { state.hideTabView = true })
.onDisappear(perform: { state.hideTabView = false })
}
}
当您按下“< Back”时,TabView 会稍有延迟,如果这真的困扰您,那么您可以制作一个自定义的 Back 按钮并将此 state.hideTabView = false
移动到点击该按钮的事件。
这是我能想到的一种方法 :) 此外,您可能会发现 this thread有帮助。
关于ios - 使用 NavigationLink 打开新 View 时如何隐藏 TabView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64414483/