SwiftUI使用State与Binding实现NavigationView视图展示关闭的异常问题
问题原因
- 核心冲突是
NavigationLink的label中嵌套了Button组件:NavigationLink本身自带点击触发跳转的默认交互,内层Button又额外添加了修改isActive绑定值的动作,单次点击会触发两次跳转逻辑。 - 前两层导航未出现异常是浅层导航栈下状态冲突未触发,到NavView2层级时,修改
presentNavView2为false的返回动作会被残留的重复跳转逻辑拦截,触发重新激活presentNavView2的操作,最终表现为导航栈新增一个NavView2视图。
修复方案
移除NavigationLink内层嵌套的Button,点击跳转逻辑直接由绑定了isActive参数的NavigationLink本身处理即可,无需额外添加点击事件。
修复后ContentView代码
struct ContentView: View { @State private var presentNavView1 = false var body: some View { NavigationView { List { NavigationLink(destination: NavView1(presentNavView1: self.$presentNavView1), isActive: self.$presentNavView1, label: { Text("To NavView1") }) } .navigationTitle("Home") } } }
修复后NavView1代码
struct NavView1: View { @State private var presentNavView2 = false @Binding var presentNavView1: Bool var body: some View { List { NavigationLink(destination: NavView2(presentNavView2: self.$presentNavView2), isActive: self.$presentNavView2, label: { Text("To NavView2") }) Button(action: { self.presentNavView1.toggle() }, label: { Text("Back") }) } .navigationTitle("NavView1") } }
补充说明
如果适配iOS 16及以上系统版本,更推荐使用NavigationStack配合统一的path参数管理导航栈状态,可避免多层级独立状态绑定带来的冲突问题。
内容的提问来源于stack exchange,提问作者jonthornham
相关产品推荐
相关产品推荐

