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

SwiftUI中嵌套navigationDestination触发无限循环问题排查

SwiftUI NavigationStack 嵌套导航目标触发无限循环问题

我查阅了大量SwiftUI无限循环相关的问题和解答,我的问题和已知情况有所区别。目前已定位到问题触发条件:在NavigationStack嵌套结构中,若下层navigationDestination的目标闭包引用了与for参数指定类型不同的Identifiable对象,会导致上层navigationDestination的目标闭包陷入无限循环。

我花了数小时精简代码得到以下最小复现示例,再进一步简化的话循环会消失,暂时还没完全理清底层原因。比如单层NavigationStack场景下,即使不指定for类型,目标闭包也能正常工作。

struct F3: Identifiable, Hashable {
    let id: String = UUID().uuidString
    let t: String
}
struct R3: Identifiable, Hashable {
    let id: String = UUID().uuidString
    let t:String
}
struct N3: Identifiable, Hashable {
    let id:String = UUID().uuidString
    let t: String
}
struct LV3: View { // 在App的WindowGroup中加载此View
    let f2z = [ F3(t: "A"), F3(t: "B"),]
    
    var body: some View {
        NavigationStack {
            List(f2z) { f in
                NavigationLink(f.t, value: f)
            }
            .navigationDestination(for: F3.self) { f in
                VV3() // 此处触发无限循环
            }
            .navigationTitle("L")
        }
    }
}
struct VV3: View {
    let r = R3(t: "rrr")
    let nz: [N3] = [
        N3(t: "hhh"),
        N3(t: "ttt"),
    ]
    var body: some View {
        List(nz) {
            NavigationLink($0.t, value: $0)
        }
        .navigationDestination(for: N3.self) { n in
            Text(r.t) // 改为字符串字面量或`n.t`可修复无限循环
        }
        .navigationTitle("V")
    }
}
  • 关键修复点:在VV3的navigationDestination闭包中,将Text(r.t)替换为字符串字面量(如Text("fix"))或使用当前导航目标对应的n.t,无限循环即可消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:15:53