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

如何以编程方式调用NavigationLink?原实现方法已弃用

确实,你提到的直接操作presented属性的方式已经被SwiftUI弃用了,现在有两种更规范的编程式导航方案,根据你的iOS版本选择就行,我给你详细拆解:

方法1:使用NavigationStack + 路径绑定(iOS 16+,官方推荐)

从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")
    }
}
方法2:使用NavigationView + isActive绑定(iOS 13-15兼容)

如果需要兼容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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:30