从非主结构体调用ContentView时NavigationTitle不显示的原因
问题描述
主结构体文件GitaApp.swift代码如下:
@main struct GitaApp: App { @AppStorage("test_launchedBefore") var launched = false var body: some Scene { WindowGroup { if launched == true { ContentView() } else { welcome() } } } }
当launched为true时,直接显示ContentView,此时导航标题正常显示。
当launched为false时,会加载Welcome.swift中的页面,通过welcome和ending的NavigationLink跳转至ContentView:
struct welcome: View { var body: some View { NavigationStack { NavigationLink("Let's set up!", destination: ending()) } } } struct ending: View { var body: some View { NavigationLink("Let's go!", destination: ContentView() // <-- 跳转至ContentView .navigationBarBackButtonHidden(true) .navigationBarTitleDisplayMode(.large) ) } }
此时ContentView及所有Tab页面的NavigationTitle全部消失。ContentView和HomeView代码如下:
struct ContentView: View { var body: some View { TabView { HomeView() .tabItem { Image(systemName: "house") Text("Home") } ... // <-- 其他Tab } } }
struct HomeView: View { var body: some View { NavigationStack { Text("Hi").font(.largeTitle) .navigationTitle("Home") } } }
问题原因
核心问题是嵌套的NavigationStack引发导航层级冲突:
- 从
welcome页面进入时,已经存在一个顶层NavigationStack(来自welcome结构体) - 跳转至
ContentView后,HomeView内部又创建了新的NavigationStack,形成嵌套导航栈 - SwiftUI中,外层导航栈处于活跃状态时,内层导航栈的标题会被覆盖或隐藏,导致
HomeView的navigationTitle无法正常显示
另外,你在ending的NavigationLink中给ContentView设置的.navigationBarTitleDisplayMode(.large)是作用在外层导航栈上的,对HomeView内部的导航栈没有作用,反而会干扰内层导航的显示逻辑。
内容的提问来源于stack exchange,提问作者Arjun Jakkipally
相关产品推荐
相关产品推荐

