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
相关产品推荐
相关产品推荐

