iOS 15中使用EmptyView调用fullScreenCover切换视图失效如何解决
问题原因
iOS 15对SwiftUI的视图渲染优化逻辑做了调整,零大小的EmptyView会被系统从渲染树中直接剔除,依附在它之上的fullScreenCover修饰符也会随之失效,因此状态更新时没有对应的视图载体触发弹窗跳转。
修复方案
- 方案1:将
fullScreenCover修饰符移动到上层可见视图上(最推荐,兼容性最好)
不要把fullScreenCover挂载在不可见的EmptyView上,直接绑定到外层的Color或者ZStack上即可,修改后的代码示例:
struct SplashView: View { @ObservedObject var model = SplashViewModel() func verify() { // 注意原代码方法名匹配问题,此处对齐onAppear的调用 model.isActive = true } var body: some View { Color.init(hex: "#FFFFFF") .fullScreenCover(isPresented: $model.isActive) { QueryView() } // 修饰符移到可见视图层 .overlay( ZStack { VStack { GeometryReader { gp in ZStack { Image("logo") .resizable() .aspectRatio(contentMode: .fit) .padding(EdgeInsets(top: 35, leading: 20, bottom: 10, trailing: 20)) .frame(width: UIScreen.main.bounds.width * 0.75) .position(x: gp.size.width / 2, y: gp.size.height / 2) .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { self.verify() } } } } } } ).ignoresSafeArea(.all) } }
- 方案2:替换
EmptyView为不会被系统优化的占位视图
如果不想调整修饰符的位置,可以把EmptyView替换为有明确大小的透明占位视图,避免被系统优化剔除:
// 把原来的EmptyView().fullScreenCover(...)替换为以下代码即可 Color.clear .frame(width: 1, height: 1) .opacity(0) .fullScreenCover(isPresented: $model.isActive) { QueryView() }
- 额外注意点:原代码中存在方法名不匹配的问题,
onAppear中调用的是verify()方法,但定义的方法名为verifyMantinance(),请自行对齐避免逻辑错误。
内容的提问来源于stack exchange,提问作者Benjamin RD
相关产品推荐
相关产品推荐

