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
相关产品推荐
相关产品推荐

