SwiftUI技术问题:关闭Sheet后跳转视图,返回时重新弹出Sheet?
实现Sheet关闭后跳转视图,返回时重新弹出Sheet的解决方案
核心需求
- 点击Sheet内的按钮,关闭Sheet并跳转到指定视图
- 用户从跳转后的视图返回时,Sheet自动重新弹出
解决方案
无需使用已废弃的NavigationLink API,我们可以通过NavigationStack配合状态变量来实现需求,以下是完整代码:
import SwiftUI struct ContentView: View { @State private var isPresented = true @State private var selection: PresentationDetent = .medium @State private var navigationPath = NavigationPath() var body: some View { NavigationStack(path: $navigationPath) { VStack { Text("主视图") Spacer() } .sheet(isPresented: $isPresented) { VStack { Text("Sheet 内容") .presentationDetents([.medium, .large], selection: $selection) .interactiveDismissDisabled(true) .presentationDragIndicator(.hidden) Button("开始") { // 先关闭Sheet isPresented = false // 跳转到目标视图 navigationPath.append("TargetView") } .padding() } } // 监听导航路径变化,返回时重新弹出Sheet .onChange(of: navigationPath) { newPath in if newPath.isEmpty { isPresented = true } } .navigationDestination(for: String.self) { _ in TargetView() } } } } struct TargetView: View { var body: some View { VStack { Text("Hello World") Spacer() } .navigationTitle("目标视图") .navigationBarTitleDisplayMode(.inline) } }
关键逻辑说明
- 导航路径管理:使用
NavigationPath和NavigationStack控制页面跳转,替代旧的NavigationView与废弃的NavigationLink - Sheet关闭与跳转联动:Sheet内按钮点击时,先将
isPresented设为false关闭Sheet,再通过navigationPath.append()触发页面跳转 - 返回时重新弹出Sheet:通过
.onChange(of: navigationPath)监听导航路径变化,当路径为空(用户返回主视图)时,将isPresented设为true重新弹出Sheet - Sheet配置保留:保留原需求中的
presentationDetents、interactiveDismissDisabled等配置,确保Sheet交互符合预期
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

