嵌入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
相关产品推荐
相关产品推荐

