You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 13+如何一次性关闭多个NavigationView页面

从视图C直接返回视图A的实现方案(iOS 13+)

下面提供几种可行的方法,帮你一次性从C回到A,不用逐个关闭页面:

方法1:借助UIKit的导航控制器直接返回根视图

SwiftUI的NavigationView底层基于UIKit的UINavigationController,我们可以直接获取这个控制器,调用popToRootViewController一步回到根视图A。

给C视图添加返回按钮的代码:

struct C: View {
    var body: some View {
        VStack {
            Text("This is view C")
            Button("Back to A") {
                // iOS 13 适配场景下获取当前导航控制器
                let activeScene = UIApplication.shared.connectedScenes
                    .filter { $0.activationState == .foregroundActive }
                    .first as? UIWindowScene
                guard let navController = activeScene?.windows.first?.rootViewController as? UINavigationController else { return }
                navController.popToRootViewController(animated: true)
            }
        }
    }
}

方法2:用绑定变量控制整个导航链路

通过在根视图A中定义一个状态变量,把绑定传递给B和C,修改这个变量就能直接关闭所有后续页面回到A。

修改后的完整代码:

struct A: View {
    @State private var isNavigating = false
    
    var body: some View {
        NavigationView {
            VStack {
                // 用isActive绑定控制导航状态
                NavigationLink(destination: B(isNavigating: $isNavigating), isActive: $isNavigating) {
                    Text("Go to B")
                }
            }
        }
    }
}

struct B: View {
    @Binding var isNavigating: Bool
    @State private var goToC = false
    
    var body: some View {
        VStack {
            Text("This is view B")
            NavigationLink(destination: C(isNavigating: $isNavigating), isActive: $goToC) {
                Text("Go to C")
            }
        }
    }
}

struct C: View {
    @Binding var isNavigating: Bool
    
    var body: some View {
        VStack {
            Text("This is view C")
            Button("Back to A") {
                // 把绑定值设为false,直接回到A
                isNavigating = false
            }
        }
    }
}

方法3:iOS 14+ 用新版dismiss方法(兼容iOS13)

如果你的App需要兼容iOS14及以上,可以用新版的@Environment(\.dismiss),连续调用两次dismiss就能关闭C和B;iOS13则 fallback 到方法1的实现:

struct C: View {
    @Environment(\.presentationMode) var presentationMode
    @Environment(\.dismiss) private var dismiss // iOS14+ 新增
    
    var body: some View {
        VStack {
            Text("This is view C")
            Button("Back to A") {
                if #available(iOS 14.0, *) {
                    // 连续调用两次,依次关闭C和B
                    dismiss()
                    dismiss()
                } else {
                    // iOS13 下用UIKit的方式返回根视图
                    let activeScene = UIApplication.shared.connectedScenes
                        .filter { $0.activationState == .foregroundActive }
                        .first as? UIWindowScene
                    guard let navController = activeScene?.windows.first?.rootViewController as? UINavigationController else { return }
                    navController.popToRootViewController(animated: true)
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Ron Weasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:26:03