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

SwiftUI导航至其他视图时Bottom Sheet未自动消失的问题咨询

问题解答

核心结论

这是SwiftUI Sheet的默认行为,同时你当前的代码写法(.constant(true))放大了这个问题:

  • 原生SwiftUI的Sheet(包括你基于它封装的自定义Bottom Sheet)是依附于当前视图层级的,导航到新视图只是在NavigationStack的视图栈中叠加新页面,不会自动触发之前视图上Sheet的关闭。
  • 你用了.constant(true)这个不可变的静态值来控制Sheet的显示,它完全不会响应任何状态变化,所以无论导航到哪里,Sheet都会保持显示状态。

简便解决方法

不需要在每个NavigationLink里手动切换布尔值,只需通过监听NavigationStack的导航路径变化,自动控制Sheet的显示状态即可,步骤如下:

1. 替换静态值为可绑定状态变量

把.constant(true)换成@State(或跨视图的@Binding/@Published)变量,让Sheet的状态可以被动态修改:

struct YourRootView: View {
    @State private var showBottomSheet = true
    @State private var navigationPath = NavigationPath() // 用于监听导航动作

    var body: some View {
        NavigationStack(path: $navigationPath) {
            ZStack {
                // 你的视图内容及NavigationLink
                NavigationLink("跳转到详情页", value: "DetailPage")
            }
            .bottomSheet(
                presentationDetents: [.height(70), .medium, .large],
                isPresented: $showBottomSheet,
                sheetCornerRadius: 20
            ) {
                OrderScrollView()
            } onDismiss: {}
            // 监听导航路径变化,自动关闭Sheet
            .onChange(of: navigationPath) { _ in
                showBottomSheet = false
            }
        }
    }
}

2. 可选:返回根视图时自动恢复Sheet

如果需要从详情页返回根视图时重新打开Sheet,只需修改监听逻辑:

.onChange(of: navigationPath) { newPath in
    showBottomSheet = newPath.isEmpty // 路径为空时(回到根视图)打开,否则关闭
}

3. 自定义Bottom Sheet的注意点

你的封装代码中使用了UIKit的UISheetPresentationController,由于已经通过isPresented绑定了状态变量,原生Sheet会自动同步用户手动拖拽关闭Sheet的动作到showBottomSheet变量中,无需额外处理状态同步。

内容的提问来源于stack exchange,提问作者user19402781

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:05:19