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

SwiftUI中NavigationLink点击后立即返回问题排查求助

解决新版NavigationLink点击后立即返回的问题

嘿,我帮你分析了下代码,这个问题大概率是状态管理冲突或者Selection绑定异常导致的,我给你拆解下可能的原因和对应的解决办法:

最可能的原因:手动设置Selection与NavigationLink的自动逻辑冲突

你用的是带tag和selection的程序化导航模式NavigationLink,这种模式下,NavigationLink本身会在用户点击内容时自动把对应的tag值赋值给绑定的selection变量,从而触发页面跳转。但你在内部Button的action里又手动设置了self.selection = t.id,这会导致两次修改selection的操作,很可能引发状态混乱,最终导致跳转后selection被意外重置回nil,页面就自动返回了。

解决办法:移除Button里的self.selection = t.id

把Button的action代码改成这样:

Button(action: {
    // 移除 self.selection = t.id 这一行
    self.settings.fixtureId = t.fixtureId
    self.settings.teamHomeId = t.teams.teamHomeId
    self.settings.teamAwayId = t.teams.teamAwayId
    self.settings.teamHome = t.teams.teamHome
    self.settings.teamAway = t.teams.teamAway
}) {
    HStack {
        Text("Go")
            .foregroundColor(Color.white)
    }
    .frame(minWidth: 0, maxWidth: .infinity)
    .padding(20)
    .background(Color.init(red: 0.80, green: 0.16, blue: 0.24))
    .cornerRadius(7)
}

其他需要排查的点

如果上面的方法没用,你可以检查下面这几个地方:

  • Selection的类型是否和Tag匹配:确保selection的可选类型和t.id的类型完全一致,比如t.id是UUID,那selection应该是UUID?;如果是Int,就是Int?。类型不匹配的话,NavigationLink无法正确匹配tag和selection,跳转后会立即返回。
  • Selection的生命周期是否稳定:确认selection是用@State或者@Binding绑定的持久状态,比如:
    @State private var selection: YourIDType? = nil
    
    如果selection是局部变量或者绑定了一个会被频繁重置的对象,也会导致跳转后状态丢失。
  • Settings修改是否触发视图重新渲染:如果你修改settings时导致当前视图重新渲染,要确保重新渲染不会把selection重置回nil(用@State的话不会有这个问题,但如果是其他状态管理方式可能会出问题)。

补充:程序化NavigationLink的正确逻辑

这种带selection和tag的NavigationLink,正确的使用逻辑是:

  1. 定义一个可选类型的状态变量(比如@State var selection: UUID?)
  2. 给每个NavigationLink设置唯一的tag(对应数据的id)
  3. 当用户点击NavigationLink的内容时,系统自动把tag赋值给selection,触发跳转
  4. 当你想手动返回时,把selection设为nil即可

这样就不需要在Button里手动设置selection啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:59:51