使用NavigationLink循环加载视图时出现黑屏返回及链接无法激活问题
嗨,我之前也踩过这个坑,一看你调试器里的提示就明白问题根源了——NavigationLink找不到对应的navigationDestination来处理你要跳转的Missions类型数据,这才导致点击后黑屏几秒又跳回根视图。别着急,按下面的步骤排查就能解决:
先把
navigationDestination放在正确的位置
你得确保循环里的NavigationLink是包裹在NavigationStack里面的,而且对应的navigationDestination必须声明在NavigationStack的有效范围内(不能藏在循环或者深层子视图里,不然SwiftUI找不到它)。比如正确的结构应该是这样:struct RootView: View { let missions: [Missions] = // 你的任务数据数组 var body: some View { NavigationStack { List(missions) { mission in // 给NavigationLink传单个Missions实例作为value NavigationLink("查看任务:\(mission.name)", value: mission) } // 在这里声明对应Missions类型的目标视图 .navigationDestination(for: Missions.self) { targetMission in MissionDetailView(mission: targetMission) } } } }重点:
navigationDestination的for参数必须和NavigationLink的value类型完全匹配(这里是Missions.self),位置一定要在NavigationStack的子视图修饰符里,确保SwiftUI能在跳转时找到它。确认
Missions类型遵循Identifiable协议
要让navigationDestination能正确匹配类型,Missions必须是可识别的。如果还没加,赶紧给它添上协议:struct Missions: Identifiable { let id: UUID = UUID() // 用你自己的唯一标识字段也可以 var name: String // 其他属性 }要是你不想用
Identifiable,也可以在navigationDestination里指定id的提取方式,比如.navigationDestination(for: Missions.self, id: \.yourUniqueId),但用Identifiable是最省心的方式。检查循环里的传值是否正确
确保你在循环中给NavigationLink的value传的是单个Missions实例,而不是整个数组或者其他类型。比如用ForEach(missions) { mission in ... }的话,mission就是单个实例,传这个才对,别不小心写成value: missions(整个数组),那样类型不匹配肯定会出问题。如果用的是旧版
NavigationView
要是你还在使用NavigationView而不是新的NavigationStack,那可以直接把目标视图传给NavigationLink的destination参数,不用navigationDestination:NavigationLink(destination: MissionDetailView(mission: mission)) { Text("查看任务:\(mission.name)") }不过苹果现在更推荐
NavigationStack+navigationDestination的组合,建议尽量升级到新API哦。
总的来说,只要让NavigationLink的传值类型和navigationDestination声明的类型完全对应,并且把navigationDestination放在正确的位置,这个黑屏返回的问题就能解决啦。
内容来源于stack exchange

