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

iOS 16中SwiftUI创建视图链:替代废弃NavigationView方案咨询

iOS 16+ 替代NavigationView实现指定视图导航链方案

需求背景

需要在SwiftUI中实现如下导航流程:view1 → view2 → view3 → view4,最终从view4直接返回至view3(view3为整个导航链的根视图)。此前使用的NavigationView已被废弃,想了解iOS 16.0及以上的替代方案。已知NavigationStack但不确定是否适用,因为看起来它更多用于列表与详情页场景。

原实现代码示例:

enum Screens {
    case view1
    case view2
}

extension Screens: Hashable {}

final class SettingsNavigationManager: ObservableObject {
    
    @Published var screen: Screens? {
        didSet {
            print("📱 \(screen)")
        }
    }
    
    func push(to screen: Screens) {
        self.screen = screen
    }
    
    func popToRoot() {
        self.screen = nil
    }
}

struct ViewOne: View {
    @EnvironmentObject var settingsNavManager: SettingsNavigationManager
    var body: some View{
        Button("Go to ViewTwo") {
            settingsNavManager.push(to: .view2)
        }
        .background(
            NavigationLink(
                destination: ViewTwo(),
                tag: .view2,
                selection: $settingsNavManager.screen) { EmptyView() }
        )
    }
}

(动图说明:演示了旧方式下的导航跳转流程,点击按钮依次切换视图,最终返回指定根视图)

解决方案:使用NavigationStack实现自定义导航链

NavigationStack完全可以满足你的需求,它并非仅局限于列表-详情场景,通过路径绑定可以灵活管理任意复杂的导航栈。以下是适配需求的完整实现:

1. 扩展导航路径枚举

补充所有需要的视图类型:

enum Screens: Hashable {
    case view1
    case view2
    case view3
    case view4
}

2. 重构导航管理器

将单视图状态改为路径数组,用于管理整个导航栈的层级:

final class SettingsNavigationManager: ObservableObject {
    // 数组元素顺序对应导航栈内视图的层级
    @Published var path: [Screens] = []
    
    // 推送新视图到栈顶
    func push(to screen: Screens) {
        path.append(screen)
    }
    
    // 从view4直接返回至view3:截断路径到view3所在层级
    func popToView3() {
        if let view3Index = path.firstIndex(of: .view3) {
            path = Array(path.prefix(view3Index + 1))
        }
    }
    
    // 通用返回上一级方法
    func pop() {
        guard !path.isEmpty else { return }
        path.removeLast()
    }
}

3. 构建NavigationStack及视图链

根视图绑定导航路径,通过navigationDestination匹配路径对应的视图:

struct RootView: View {
    @StateObject private var navManager = SettingsNavigationManager()
    
    var body: some View {
        NavigationStack(path: $navManager.path) {
            // 导航栈的根视图为View3
            View3()
                .environmentObject(navManager)
                .navigationDestination(for: Screens.self) { screen in
                    switch screen {
                    case .view1: View1()
                    case .view2: View2()
                    case .view3: View3()
                    case .view4: View4()
                    }
                }
        }
    }
}

struct View1: View {
    @EnvironmentObject var navManager: SettingsNavigationManager
    
    var body: some View {
        VStack {
            Text("View 1")
            Button("跳转到View2") {
                navManager.push(to: .view2)
            }
        }
        .navigationTitle("View1")
    }
}

struct View2: View {
    @EnvironmentObject var navManager: SettingsNavigationManager
    
    var body: some View {
        VStack {
            Text("View 2")
            Button("跳转到View3") {
                navManager.push(to: .view3)
            }
        }
        .navigationTitle("View2")
    }
}

struct View3: View {
    @EnvironmentObject var navManager: SettingsNavigationManager
    
    var body: some View {
        VStack {
            Text("View 3(根视图)")
            Button("跳转到View4") {
                navManager.push(to: .view4)
            }
        }
        .navigationTitle("View3")
    }
}

struct View4: View {
    @EnvironmentObject var navManager: SettingsNavigationManager
    
    var body: some View {
        VStack {
            Text("View 4")
            Button("返回至View3") {
                navManager.popToView3()
            }
        }
        .navigationTitle("View4")
    }
}

核心优势

  • 路径绑定精准控制:通过修改path数组即可实现推送、弹出、跳转到指定层级等所有导航操作
  • 无需隐藏NavigationLink:摆脱旧方式中依赖隐藏链接的繁琐实现
  • 全局状态管理:通过EnvironmentObject让所有视图共享导航状态,统一控制流程

内容的提问来源于stack exchange,提问作者Diego Enrique Molina Sanchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:25:27