iOS16中如何实现NavigationLink的编程式页面跳转
iOS 16 废弃带isActive参数的NavigationLink构造器后,可通过苹果配套推出的NavigationStack新路由体系实现编程式跳转,能力完全覆盖旧方案,常用实现方式分两类:
单页面布尔触发方案(和原
isActive逻辑完全对齐)
首先将旧版根容器NavigationView替换为iOS16新增的NavigationStack,无需再写空label的隐藏NavigationLink,直接通过navigationDestination(isPresented:destination:)修饰符绑定触发布尔值即可,代码示例:NavigationStack { // 主页面内容 ContentView() // 绑定原触发用的searched状态,逻辑和旧版isActive完全一致 .navigationDestination(isPresented: $searched) { SearchView(originalSearchPhrase: $searchedPhrase) } }跳转触发逻辑和旧版完全相同:将绑定的
searched布尔值置为true即可自动push到目标页面,用户手动返回时系统会自动将该布尔值重置为false,无需额外手动处理状态。多页面统一路由方案(适合复杂跳转场景)
如果页面有多个跳转目标,可以用基于类型的路由统一管理,比旧版维护多个isActive布尔值的方式更易维护:- 先定义所有跳转目标的路由枚举,遵循
Hashable协议
enum AppRoute: Hashable { case search(originalPhrase: String) case userDetail(userId: String) case settings }- 在
NavigationStack上绑定路由路径状态,统一注册所有路由对应的目标页面
// 导航路径状态,控制整个栈的页面层级 @State private var navPath = NavigationPath() NavigationStack(path: $navPath) { ContentView() .navigationDestination(for: AppRoute.self) { route in switch route { case .search(let phrase): SearchView(originalSearchPhrase: .constant(phrase)) case .userDetail(let uid): UserDetailView(userId: uid) case .settings: SettingsView() } } }触发跳转时,直接向
navPath追加对应路由值即可,比如跳转搜索页调用navPath.append(AppRoute.search(originalPhrase: searchedPhrase));返回上一级调用navPath.removeLast();需要直接返回根页面时,直接将navPath重置为空数组即可。- 先定义所有跳转目标的路由枚举,遵循
注意:如果项目需要兼容iOS15及更早系统,旧版带
isActive的NavigationLink构造器虽然被标记为废弃,但在iOS16+系统中依然可以正常运行,迁移新API时可按系统版本做适配处理。
内容的提问来源于stack exchange,提问作者fballjeff

