SwiftUI:Sheet嵌套场景下NavigationLink全屏跳转的视图层级配置
解决方案
要实现ThirdView通过NavigationLink打开全屏带返回按钮的FourthView,核心是调整NavigationView的层级位置,不要将其包裹在sheet外部,而是放在ThirdView内部:
- 保持SecondView打开ThirdView的sheet代码不变,无需在sheet中嵌套NavigationView:
.sheet(isPresented: $showSheet) { ThirdView() }
- 在ThirdView内部添加NavigationView,并将NavigationLink置于其中:
struct ThirdView: View { var body: some View { NavigationView { VStack { // 点击后打开全屏的FourthView,自带返回按钮 NavigationLink(destination: FourthView()) { Text("Open FourthView") } } // 可选:隐藏ThirdView的导航栏,只让FourthView显示导航栏 .navigationBarHidden(true) } } }
- FourthView只需保持基础结构,导航栏会自动继承NavigationView的上下文,生成返回按钮:
struct FourthView: View { var body: some View { VStack { Text("Fourth View") } .navigationBarTitle("Fourth", displayMode: .inline) } }
原理说明
把NavigationView放在ThirdView内部后,sheet仅负责展示ThirdView,而ThirdView的导航栈由内部的NavigationView管理。当触发NavigationLink时,FourthView会全屏覆盖当前的sheet层级,并且基于导航栈自动生成返回按钮,点击后回到ThirdView的sheet界面。
内容的提问来源于stack exchange,提问作者Darya
相关产品推荐
相关产品推荐

