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
相关产品推荐
相关产品推荐

