如何以编程方式调用NavigationLink?原实现方法已弃用
确实,你提到的直接操作presented属性的方式已经被SwiftUI弃用了,现在有两种更规范的编程式导航方案,根据你的iOS版本选择就行,我给你详细拆解:
从iOS 16开始,Apple推出了NavigationStack替代旧的NavigationView,配合路径绑定可以实现非常灵活的编程式导航,这也是目前最推荐的方案。
核心思路:
- 定义一个状态变量来管理导航路径(比如
NavigationPath类型) - 在
NavigationStack中绑定这个路径 - 通过修改路径内容触发导航,通过清空/移除路径元素实现返回
代码示例:
import SwiftUI // 用枚举标识不同的目标视图,让导航逻辑更清晰 enum NavigationDestination { case view1 case view2 } struct ContentView: View { @State private var navigationPath = NavigationPath() @State private var option = 1 var body: some View { NavigationStack(path: $navigationPath) { Button("触发导航") { switch option { case 1: navigationPath.append(NavigationDestination.view1) default: navigationPath.append(NavigationDestination.view2) } } // 匹配路径中的元素,对应展示目标视图 .navigationDestination(for: NavigationDestination.self) { destination in switch destination { case .view1: MyView1() case .view2: MyView2() } } } } } // 示例目标视图 struct MyView1: View { var body: some View { Text("这是视图1") .navigationTitle("视图1") } } struct MyView2: View { var body: some View { Text("这是视图2") .navigationTitle("视图2") } }
如果需要兼容iOS 15及更早版本,可以借助NavigationLink的isActive绑定属性,把导航链接隐藏起来,通过控制布尔值触发导航。
核心思路:
- 为每个目标视图定义一个布尔状态变量
- 创建隐藏的
NavigationLink,绑定对应的布尔值 - 通过修改布尔值来触发/关闭导航
代码示例:
import SwiftUI struct ContentView: View { @State private var isView1Active = false @State private var isView2Active = false @State private var option = 1 var body: some View { NavigationView { Button("触发导航") { if option == 1 { isView1Active = true } else { isView2Active = true } } // 隐藏导航链接,仅用于触发导航逻辑 NavigationLink(destination: MyView1(), isActive: $isView1Active) { EmptyView() } NavigationLink(destination: MyView2(), isActive: $isView2Active) { EmptyView() } } } } // 示例目标视图同方法1
额外提示:
- 如果是新项目,优先选择方法1,
NavigationStack是SwiftUI导航的未来趋势,支持更复杂的导航栈管理 - 方法2中,也可以用单个布尔值+动态目标视图的方式简化代码,但多布尔值的方式逻辑更清晰
内容的提问来源于stack exchange,提问作者Yarm
相关产品推荐
相关产品推荐

