SwiftUI中如何实现从SheetView触发返回RootView的操作
问题原因
SwiftUI 中 sheet 弹出的视图属于独立的视图层级,默认不会继承父视图注入的自定义环境变量,你在 SheetView 中读取到的rootPresentationMode是扩展里定义的默认常量绑定,修改后不会同步到 RootController 的状态,因此无法触发返回逻辑。此外你代码中存在笔误也可能导致逻辑失效:SecondView 中sheet(isPresented:)绑定的参数名和你定义的@State变量名不一致。
可行解决方案
步骤1:修复笔误
将 SecondView 中 sheet 的绑定参数修改为正确的变量:
.sheet(isPresented: $isShowingSheetView){ // 原来写的是$isShowingEditProjectSheet,和定义的State名不符 SheetView(showingSheetView: self.$isShowingSheetView) }
步骤2:手动给Sheet注入环境变量
在弹出 Sheet 时手动传递rootPresentationMode环境变量,让 Sheet 可以读取到上层的绑定状态:
.sheet(isPresented: $isShowingSheetView){ SheetView(showingSheetView: self.$isShowingSheetView) // 注入上层的rootPresentationMode .environment(\.rootPresentationMode, self.rootPresentationMode) }
步骤3:优化返回逻辑避免动画异常
触发返回时先关闭 Sheet,等动画结束后再执行返回根视图操作,避免界面显示异常:
// SheetView中的Delete按钮逻辑 Button("Delete"){ print("attempt to pop") // 先关闭当前Sheet showingSheetView.wrappedValue = false // 等待Sheet关闭动画完成后触发返回根视图 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { self.rootPresentationMode.wrappedValue.dismiss() } }
补充说明
如果你的项目支持iOS16及以上版本,更建议使用NavigationStack配合NavigationPath实现返回根视图,直接将path置空即可清空整个导航栈,无需自定义环境变量。
内容的提问来源于stack exchange,提问作者scientiffic
相关产品推荐
相关产品推荐

