我有一个带有两个选项卡的
我考虑将
以下是我的代码片段:
在每个将呈现表格或推出新视图的视图中,我都添加了类似于以下内容的代码:
这导致了观点被尴尬地驳回:
TabView
在一个SwiftUI
生命周期应用程序中,其中一个选项卡具有复杂的视图结构:NavigationView
,其内部有许多子视图,例如:NavigationLink
和它们的DestinationView
分散在多个级别的视图树中,每个子视图本身都是另一个视图层次结构,具有sheet
和/或其他DestinationView
。在这个层次结构的某个位置,我想要将TabView
重置为其最初状态,即显示第一个视图,以便用户可以在该状态下重新开始他们的旅程,就像他们第一次打开应用程序那样,因此很难追踪isActive
和isPresented
绑定来弹出或解除视图和表格。我考虑将
TabView
包装在另一个视图RootView
中,试图找到一种重新创建TabView
的简单方法或类似于刷新/重置 TabView
的方式,但无法找到如何实现的线索。以下是我的代码片段:
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
RootView()
}
}
}
struct RootView: View {
var body: some View {
ContentView()
}
}
struct ContentView: View {
var body: some View {
TabView { // <-- I need to reset it to its original state
View1() // <---- this view has complex view hierarchy
.tabItem {
Text("Home")
}.tag(0)
View2()
.tabItem {
Text("Settings")
}.tag(1)
}
}
}
p.s.我不想做“将视图弹出到根视图”的操作,因为当有许多活动的NavigationLink
目标时,用户可能会打开其中一个sheet并在sheet中开始新的导航旅程。
****** 更新 ******
我创建了一个新的Environment
值来保存一个布尔值,该值应指示TabView
是否应重置,我跟踪每个视图中的isPresented
和isActive
状态变量,并在该环境值设置为true
后将它们重置,就像这样:
struct ResetTabView: EnvironmentKey {
static var defaultValue: Binding<ResetTabObservable> = .constant(ResetTabObservable())
}
extension EnvironmentValues {
var resetTabView: Binding<ResetTabObservable> {
get { self[ResetTabView.self] }
set { self[ResetTabView.self] = newValue }
}
}
class ResetTabObservable: ObservableObject {
@Published var newValue = false
}
在每个将呈现表格或推出新视图的视图中,我都添加了类似于以下内容的代码:
struct View3: View {
@State var showSheet = false
@Environment(\.resetTabView) var reset
var body: some View {
Text("This is view 3")
Button(action: {
showSheet = true
}, label: {
Text("show view 4")
})
.sheet(isPresented: $showSheet) {
View4()
}
.onReceive(reset.$newValue.wrappedValue, perform: { val in
if val == true {
showSheet = false
}
})
}
}
在最后一个视图中(将重置TabView
),我会像这样切换Environment
的值:
struct View5: View {
@Environment(\.resetTabView) var reset
var body: some View {
VStack {
Text("This is view 5")
Button(action: {
reset.newValue.wrappedValue = true
}, label: {
Text("reset tab view")
})
}
}
}
这导致了观点被尴尬地驳回: