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 }
核心疑问
- 此现象是SwiftUI的Bug还是设计特性?如果是特性,请说明设计逻辑
- Sheet是否存在视图归属概念?即:
- Sheet是否应该随绑定的宿主视图销毁而关闭?
- 还是Sheet的生命周期与定义它的视图层级无关?
原本以为后者成立,但ScrollView下Sheet自动关闭的现象无法解释。
内容的提问来源于stack exchange,提问作者rayx
相关产品推荐
相关产品推荐

