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

SwiftUI NavigationLink多选触发报错及列表无响应问题求解

问题根因

这是iOS 15系统SwiftUI的已知bug,多个NavigationLink同时被触发时会导致导航栈状态错乱,最终页面失去响应。以下两种方案均可以保留你需要的点击行变暗效果,无需修改现有NavigationLink嵌套结构:


方案1:添加导航状态锁(兼容性最好)

新增状态变量标记导航进行状态,跳转过程中禁用所有其他NavigationLink的点击,从逻辑上避免多链接同时触发。
修改后的ContentView代码如下:

struct ContentView: View {
    var cars = [Car(name: "A"), Car(name: "B"), Car(name: "C"), Car(name: "D")]
    // 新增导航状态标记
    @State private var isNavigating = false
    
    var body: some View {
        NavigationView {
            LazyVStack(spacing: 10) {
               ForEach(cars, id: \.self) { car in
                   NavigationLink(destination: {
                       CarDetailsView(viewModel: CarDetailsViewModel(car: car))
                           // 跳转页面出现时标记为导航中
                           .onAppear {
                               isNavigating = true
                           }
                           // 页面消失时解除状态锁
                           .onDisappear {
                               isNavigating = false
                           }
                   },
                   label: {
                       CarRowView(car: car)
                   })
                   // 导航中禁用当前链接点击
                   .disabled(isNavigating)
               }
           }
        }
    }
}

方案2:禁用多点触摸(代码改动最小)

直接给LazyVStack添加禁用多点触摸的修饰符,从交互层面避免同时选中多个行:

LazyVStack(spacing: 10) {
    // 原有ForEach代码保持不变
}
.allowsMultipleTouches(false)

补充说明

如果后续你的应用最低支持版本升级到iOS 16+,直接将NavigationView替换为NavigationStack即可从底层彻底解决这个bug,无需额外添加兼容代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:05