我有我的 ContentView
,它是一个 TabView
,带有 View1
和 View2
作为标签:
struct ContentView: View {
@State private var selection: Tab = .View1
enum Tab {
case View1
case View2
}
var body: some View {
TabView(selection: $selection) {
View1()
.tabItem {
Label("View1", systemImage: "")
}
.tag(Tab.View1)
View2()
.tabItem {
Label("View2", systemImage: "")
}
.tag(Tab.View2)
}
}
}
View1
是带有 NavigationView
到子视图的 NavigationLink
:
struct View1: View {
var body: some View {
NavigationView {
NavigationLink(destination: Text("Subview1")) {
Text("Hello, View1!")
}
}
}
}
当我在 View1
的 SubView 中时,通过选项卡更改为 View2
并更改回(再次通过选项卡)为 View1
,它恢复子视图,即美好的。我怎样才能通过按 View1
again 的标签来实现这一点,它让我进入 View1
的顶级(即 View1
与“Hello, View1 ”)。截至目前,我必须使用左上角的 NavigationLink
。
答案 0 :(得分:3)
可能的方法是使用具有副作用的代理绑定来重置具有导航视图的视图,因此将其git 到初始状态。
使用 Xcode 12.4 / iOS 14.4 准备的演示
struct ContentView: View {
@State private var selection: Tab = .View1
// force-reset property
@State private var reset = UUID()
enum Tab {
case View1
case View2
}
var body: some View {
let proxy = Binding(get: {selection}, set: {
if selection == $0 {
reset = UUID() // << update if same tab clicked !!
}
selection = $0
})
TabView(selection: proxy) {
View1()
.tabItem {
Label("View1", systemImage: "")
}
.tag(Tab.View1)
.id(reset) // reset on changed !!
View2()
.tabItem {
Label("View2", systemImage: "")
}
.tag(Tab.View2)
}
}
}