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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:24:05