SwiftUI 导航到 NavigationView 堆栈的底部 [英] SwiftUI navigate to bottom of NavigationView stack
问题描述
我有以下设置,其中父视图包含一个 NavigationView
,它显示一系列页面,A、B 和 C.在页面 C 上有一个隐藏导航视图的按钮.我想要它,以便在再次显示导航视图时,它会自动导航到页面 A,但是我不确定如何使用 SwiftUI 执行此操作,如何实现?
I have the following set up where a parent view holds a NavigationView
which displays a series of pages, A, B and C. On page C there is a button which hides the navigation view. I want to have it so that when the navigation view is shown again, it automatically navigates to page A, however I am unsure how to do this with SwiftUI, how can this be achieved?
struct ParentView: View {
@State var showNavigation:Bool = true
var body: some View {
ZStack {
Button(action: {
self.showNavigation = true
}) {
Text("Show navigation")
}
NavigationView {
NavigationLink(destination: ChildA(showNavigation: $showNavigation)) {
Text("Go to A")
}
}.opacity(showNavigation ? 1.0 : 0.0)
}
}
}
struct ChildA: View {
@Binding var showNavigation:Bool
var body: some View {
VStack {
Text("A")
NavigationLink(destination: ChildB(showNavigation: $showNavigation)) {
Text("Go to B")
}
}
}
}
struct ChildB: View {
@Binding var showNavigation:Bool
var body: some View {
VStack {
Text("B")
NavigationLink(destination: ChildC(showNavigation: $showNavigation)) {
Text("Go to C")
}
}
}
}
struct ChildC: View {
@Binding var showNavigation:Bool
var body: some View {
VStack {
Text("C")
Button(action: {
self.showNavigation = false
}) {
Text("Hide Navigation")
}
}
}
}
推荐答案
这里的设置并不复杂.一件事是对于任何中间视图,您必须设置 .isDetailLink(false)
.否则,它们将在倒带过程中保留.
The setting here is not complicated. One thing is for any intermediate view, you have to set .isDetailLink(false)
. Otherwise, they will be kept during rewinding.
struct ParentView: View {
@State var showNavigation:Bool = true
@State var isActive:Bool = true
var body: some View {
ZStack {
Button(action: {
self.showNavigation = true
}) {
Text("Show navigation")
}
NavigationView {
NavigationLink.init(destination: ChildA(showNavigation: $showNavigation, isActive: $isActive ), isActive: $isActive){
Text("Go to A")
}
}.opacity(showNavigation ? 1.0 : 0.0)
}
}
}
struct ChildA: View {
@Binding var showNavigation:Bool
@Binding var isActive:Bool
@State var isNextActive:Bool = false
var body: some View {
VStack {
Text("A")
NavigationLink(destination: ChildB(showNavigation: $showNavigation, isActive: $isNextActive), isActive: $isNextActive) {
Text("Go to B")
}.isDetailLink(false)
}.onReceive(Just(isNextActive)) { isNextActive in
if isNextActive == false && (!self.showNavigation) {
self.isActive = false
}
}
}
}
struct ChildB: View {
@Binding var showNavigation:Bool
@Binding var isActive:Bool
@State var isNextActive:Bool = false
var body: some View {
VStack {
Text("B")
NavigationLink(destination: ChildC(showNavigation: $showNavigation, isActive: $isNextActive), isActive: $isNextActive) {
Text("Go to C")
}.isDetailLink(false)
}.onReceive(Just(isNextActive)) { isNextActive in
if isNextActive == false && (!self.showNavigation) {
DispatchQueue.main.async {
self.isActive = false}
}
}
}
}
struct ChildC: View {
@Binding var showNavigation:Bool
@Binding var isActive:Bool
var body: some View {
VStack {
Text("C")
Button(action: {
self.showNavigation = false
self.isActive = false
}) {
Text("Hide Navigation")
}
}
}
}
这篇关于SwiftUI 导航到 NavigationView 堆栈的底部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!