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

嵌入TabView的NavigationLink多次点击后失效问题

问题描述

将NewGameView嵌入TabView后,其中指向LoadView的NavigationLink仅能正常工作1-2次,之后点击虽有动画反馈,但无法打开LoadView。未嵌入TabView时功能完全正常,NewGameView单独预览也无问题,仅在ContentView的TabView场景下出现该失效问题。

相关代码

ContentView.swift

struct ContentView: View {    
    var body: some View {
        TabView {
            NewGameView()
                .tabItem { Label("cargar", systemImage: "dice") }
        }
    }
}

NewGameView.swift

struct NewGameView: View {
    var body: some View {
        NavigationStack {
            NavigationLink(value: "something", label: {
                Text("NUEVA PARTIDA")
                    .font(.headline)
                    .frame(width: 200, height: 50)
                    .foregroundColor(Color("myyellow"))
                    .background(Color("myred"))
                    .cornerRadius(15)
                    .padding()
            })
            .navigationDestination(for: String.self) { _ in
                LoadView()
                    .navigationBarBackButtonHidden(true)
            }
        }
    }
}

LoadView.swift

struct LoadView: View {
    @State var dice = DiceRoll(red_value: 1, yel_value: 1, act_value: 1)

    @Environment(\.dismiss) var dismiss
    
    var body: some View {
        VStack {
            Button("TERMINAR PARTIDA") {
                dismiss()
            }
            .font(.headline)
            .frame(width: 200, height: 50)
            .foregroundColor(Color("myyellow"))
            .background(Color("myred"))
            .cornerRadius(15)
            .padding()
            
            DiceSelectionView(dice: $dice)
            
            ButtonLoad()
        }
    }
}
解决方案

问题出在每个Tab页内部单独维护NavigationStack,TabView的视图复用机制会导致导航栈的状态紊乱,重复导航几次后就会出现链接失效的情况。

解决方法是把NavigationStack提升到TabView的外层,让整个TabBar共享同一个导航栈:

修改后的ContentView.swift

struct ContentView: View {    
    var body: some View {
        NavigationStack {
            TabView {
                NewGameView()
                    .tabItem { Label("cargar", systemImage: "dice") }
            }
        }
    }
}

修改后的NewGameView.swift

struct NewGameView: View {
    var body: some View {
        NavigationLink(value: "something", label: {
            Text("NUEVA PARTIDA")
                .font(.headline)
                .frame(width: 200, height: 50)
                .foregroundColor(Color("myyellow"))
                .background(Color("myred"))
                .cornerRadius(15)
                .padding()
        })
        .navigationDestination(for: String.self) { _ in
            LoadView()
                .navigationBarBackButtonHidden(true)
        }
    }
}

如果后续需要给不同Tab页配置独立的导航目标,只需在外层的NavigationStack内部统一添加对应的navigationDestination即可,或者保持每个Tab页的navigationDestination定义,只要导航栈在TabView外层就不会再出现状态紊乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:46:28