You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:00