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

SwiftUI中Form/List绑定的Sheet未随宿主视图销毁自动关闭问题

SwiftUI中Form/List内嵌Sheet未随宿主视图销毁自动关闭的问题

问题场景

在SwiftUI开发中,使用Form或List时遇到Sheet未自动关闭的异常情况(ScrollView下无此问题)。

代码示例

enum Value: String, Equatable {
    case a = "a"
    case b = "b"
}

struct ContentView: View {
    @State var value: Value = .a
    @State var showSheet = false

    var body: some View {
        Form {
            Section {
                switch value {
                case .a:
                    Text("a")
                        .onTapGesture {
                            showSheet = true
                        }
                        .sheet(isPresented: $showSheet) {
                            Button("Set Value to .b") {
                                value = .b
                            }
                        }
                case .b:
                    Text("b")
                }
            }
        }
    }
}

复现步骤

  • 点击文本a唤起Sheet弹窗
  • 点击Sheet内的按钮将value改为.b,此时绑定Sheet的Text("a")视图已被销毁,但Sheet并未自动关闭,不符合预期。

现象差异

  • 若将Form替换为ScrollView,Sheet会随宿主视图销毁自动关闭
  • 替换为List时,问题与Form完全一致

临时解决方案

通过监听value的变化手动关闭Sheet:

.onChange(of: value) { _ in
    showSheet = false
}

核心疑问

  1. 此现象是SwiftUI的Bug还是设计特性?如果是特性,请说明设计逻辑
  2. Sheet是否存在视图归属概念?即:
    • Sheet是否应该随绑定的宿主视图销毁而关闭?
    • 还是Sheet的生命周期与定义它的视图层级无关?
      原本以为后者成立,但ScrollView下Sheet自动关闭的现象无法解释。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:40:58