SwiftUI问题:如何从Sheet导航至全屏视图?
问题原因
你当前的代码把NavigationStack放在Sheet内部,NavigationLink的跳转只会在这个Sheet专属的导航栈里进行,所以目标视图会被限制在Sheet的尺寸范围内,无法全屏展示。
方案1:用fullScreenCover直接弹出全屏视图
这是最直接的解决方式,把Sheet里的NavigationLink换成按钮,点击后触发全屏覆盖视图:
struct ContentView2: View { @State private var sheetDisplayed = false var body: some View { VStack { Button("Show Sheet") { sheetDisplayed.toggle() }.sheet(isPresented: $sheetDisplayed) { SheetNavigationView() } } } } struct SheetNavigationView: View { @State private var showFullScreenView = false var body: some View { Button("Go to full screen view") { showFullScreenView.toggle() } .fullScreenCover(isPresented: $showFullScreenView) { SheetView() } } } struct SheetView : View { @Environment(\.dismiss) private var dismiss var body: some View { Text("View One") .navigationTitle("Full Screen View") .toolbar { Button("Dismiss") { dismiss() } } } }
方案2:将全屏视图的控制权移到主视图
如果想保留NavigationLink的交互逻辑,可以在主视图中维护状态变量,通过Sheet里的导航动作触发全屏展示:
struct ContentView2: View { @State private var sheetDisplayed = false @State private var showFullScreenView = false var body: some View { VStack { Button("Show Sheet") { sheetDisplayed.toggle() }.sheet(isPresented: $sheetDisplayed) { NavigationStack { NavigationLink("Go to view") { // 跳转后触发主视图的全屏覆盖,同时关闭Sheet(可选) Color.clear .onAppear { showFullScreenView = true sheetDisplayed = false } } } } .fullScreenCover(isPresented: $showFullScreenView) { SheetView() } } } } struct SheetView : View { @Environment(\.dismiss) private var dismiss var body: some View { Text("View One") .navigationTitle("Full Screen View") .toolbar { Button("Dismiss") { dismiss() } } } }
两种方案都能实现从Sheet跳转到全屏视图的效果,你可以根据自己的交互需求选择。
内容的提问来源于stack exchange,提问作者Pratyay Bishnupuri
相关产品推荐
相关产品推荐

