直接上代码:
文件1:NavManager.swift
import Foundation
let NAVM = NavManager.shared
// 观察者模式
class NavManager: ObservableObject {
@Published var toRoot: Bool = false
// MARK: - Singleton Instance
static let shared = NavManager()
private init() {
}
}
文件2:NavBackDemo.swift
import SwiftUI
struct ContentViewA: View {
@State private var isNavPush = false
@ObservedObject private var navm = NAVM
var body: some View {
VStack {
NavigationLink(isActive: $isNavPush) {
ContentViewB()
} label: {
Button {
isNavPush = true
} label: {
Text("导航跳转")
}
}
}
.navigationBarTitle("ContentViewA", displayMode: .inline)
// 这里是关键
.onChange(of: navm.toRoot) { value in
if value {
isNavPush = false
navm.toRoot = false
}
}
}
}
struct ContentViewB: View {
@State var isNavPush = false
var body: some View {
VStack {
NavigationLink(isActive: $isNavPush) {
ContentViewC()
} label: {
Button {
isNavPush = true
} label: {
Text("导航跳转")
}
}
}
.navigationBarTitle("ContentViewB", displayMode: .inline)
}
}
struct ContentViewC: View {
@State var isNavPush = false
var body: some View {
VStack {
NavigationLink(isActive: $isNavPush) {
ContentViewD()
} label: {
Button {
isNavPush = true
} label: {
Text("导航跳转")
}
}
}
.navigationBarTitle("ContentViewC", displayMode: .inline)
}
}
struct ContentViewD: View {
@ObservedObject private var navm = NAVM
var body: some View {
VStack {
Button {
navm.toRoot = true
} label: {
Text("返回根目录")
}
}
.navigationBarTitle("ContentViewD", displayMode: .inline)
}
}
#Preview {
NavigationView {
ContentViewA()
}
}