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

iOS16中SwiftUI使用enum的fullScreenCover自动反复开关问题

iOS 16.2/16.3中SwiftUI fullScreenCover结合enum的循环弹窗问题

在iOS 16.2和16.3版本中,使用SwiftUI的fullScreenCover结合枚举管理全屏覆盖层时,会出现异常行为:从sheet A打开sheet B后,在sheet B的onAppear方法中修改ObservableObject的@Published属性,会导致全屏覆盖层持续自动显示和消失。该问题在iOS 17版本中已修复,可正常运行。

复现代码

import SwiftUI
enum CameraSheet: String, Identifiable{
    var id: String{
        self.rawValue
    }
    case aaa, bbb
}
class ViewModel: ObservableObject {
    @Published var sheet: CameraSheet? = nil
}
class ViewModel1: ObservableObject {
    @Published var toggle: Bool = false
}
struct ContentView: View {
    @StateObject var viewModel = ViewModel()
    @StateObject var viewModel1 = ViewModel1()
    var body: some View {
        let _ = Self._printChanges()
        VStack {
            Text("ShowSheet A")
                .onTapGesture {
                    viewModel.sheet = .aaa
                }
        }
        .fullScreenCover(item: $viewModel.sheet) { item in
            if item == .aaa {
                Button("AAA"){
                    showBBB()
                }
            }
            if item == .bbb {
                Button("AAA"){
                    showAAA()
                }
                .onAppear{
                    viewModel1.toggle.toggle() // <-------- 此处导致覆盖层无限循环
                }
            }
        }
    }
    func showBBB() {
        viewModel.sheet = .bbb
    }
    func showAAA() {
        viewModel.sheet = .aaa
    }
}

问题演示

全屏覆盖层循环弹窗演示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:22:09