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

iOS 16中NavigationLink使用方法及弃用API报错解决

针对你遇到的 init(destination:isActive:label:) 在 iOS 16.0 被弃用的问题,改用 NavigationStack + 导航路径的方式即可替代原有逻辑,以下是具体修改方案:

1. 替换导航容器并定义路径变量

首先将旧的 NavigationView 替换为 iOS 16+ 推荐的 NavigationStack,同时声明一个用于管理导航栈的状态变量:

struct YourMainView: View {
    @State private var selectedCoin: Coin?
    @State private var showDetailView = false
    // 用 NavigationPath 管理任意类型的导航路径,也可以用 [Coin]() 明确指定类型
    @State private var navigationPath = NavigationPath()

    var body: some View {
        NavigationStack(path: $navigationPath) {
            // 你的主视图内容
            // ...
        }
        // 关联数据类型与目标视图
        .navigationDestination(for: Coin.self) { coin in
            DetailLoadingView(coin: .constant(coin))
        }
    }
}

原来通过 isActive 触发导航的逻辑,改为监听 showDetailView 的状态变化来操控导航路径:

// 替换你原来的 .background 代码块
.background(
    EmptyView()
)
.onChange(of: showDetailView) { isActive in
    if isActive, let coin = selectedCoin {
        // 触发导航:将数据添加到路径中
        navigationPath.append(coin)
    } else if !isActive {
        // 手动返回:移除路径最后一个元素
        navigationPath.removeLast()
    }
}

3. 补充说明

  • 如果需要从详情页手动返回时同步更新 showDetailView,可以在详情页添加 onDisappear 回调:
DetailLoadingView(coin: .constant(coin))
    .onDisappear {
        showDetailView = false
    }
  • 若你的导航逻辑是用户主动点击触发(而非状态变量控制),可以直接使用 NavigationLink(value:label:):
NavigationLink(value: selectedCoin) {
    Text("查看详情")
}

内容的提问来源于stack exchange,提问作者Collins Swift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:42:16