iOS 15、Xcode 13环境下EmptyView无法显示问题求助
问题解答
这是不是iOS系统Bug?
不是,这是SwiftUI在iOS 15(Xcode 13对应SDK版本)的预期行为变更:iOS 14及更早版本中,给EmptyView附加frame、background等修饰符后,系统会将其作为有效渲染视图加入视图树;但iOS 15之后,EmptyView无论附加任何修饰符,都不会被系统计入有效渲染视图层级,依附在它身上的sheet弹窗自然无法被触发。
可行解决方案
- 方案1:将
sheet修饰符挂载到有效视图上
直接把sheet绑到ZStack或者Button这类实际会渲染的视图上即可,修改后代码示例:struct ContentView: View { @State var isGo: Bool = false var body: some View { ZStack { Button(action: { self.isGo = true }, label: { Text("Go EmptyView") }) } .sheet(isPresented: $isGo, content: { PopupView() }) } } - 方案2:替换
EmptyView为可渲染的占位视图
把EmptyView换成Color.clear这类会被系统正常渲染的占位元素,原有其他逻辑不用动:Color.clear .background(Color.green) .frame(width: 100, height: 100) .sheet(isPresented: $isGo, onDismiss: nil, content: { PopupView() }) - 方案3:将弹窗状态声明提升到父容器层级统一管理
多弹窗场景下更推荐这种写法,避免视图层级变化导致弹窗绑定失效,稳定性更高。
内容的提问来源于stack exchange,提问作者윤시완
相关产品推荐
相关产品推荐

