TabView 内的 NavigationView:使用 TabItem-Buttons 时如何到达顶级 TabView
NavigationView inside TabView: How to get to top-level TabView when using the TabItem-Buttons
我有我的 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
的子视图中时,通过选项卡更改为 View2
并(再次通过选项卡)更改回 View1
,它会恢复子视图,这很好。我如何通过再次按下 View1
的选项卡 来实现这一点,它让我进入 View1
的顶层(即 View1
与“你好,View1”)。截至目前,我必须使用左上角的 NavigationLink
。
可能的方法是使用具有副作用的代理绑定来重置具有导航视图的视图,因此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 == [=10=] {
reset = UUID() // << update if same tab clicked !!
}
selection = [=10=]
})
TabView(selection: proxy) {
View1()
.tabItem {
Label("View1", systemImage: "")
}
.tag(Tab.View1)
.id(reset) // reset on changed !!
View2()
.tabItem {
Label("View2", systemImage: "")
}
.tag(Tab.View2)
}
}
}
我有我的 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
的子视图中时,通过选项卡更改为 View2
并(再次通过选项卡)更改回 View1
,它会恢复子视图,这很好。我如何通过再次按下 View1
的选项卡 来实现这一点,它让我进入 View1
的顶层(即 View1
与“你好,View1”)。截至目前,我必须使用左上角的 NavigationLink
。
可能的方法是使用具有副作用的代理绑定来重置具有导航视图的视图,因此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 == [=10=] {
reset = UUID() // << update if same tab clicked !!
}
selection = [=10=]
})
TabView(selection: proxy) {
View1()
.tabItem {
Label("View1", systemImage: "")
}
.tag(Tab.View1)
.id(reset) // reset on changed !!
View2()
.tabItem {
Label("View2", systemImage: "")
}
.tag(Tab.View2)
}
}
}