如何在macOS上让SwiftUI Alert显示在所有视图和Sheet之上?
实现Mac平台SwiftUI全局错误Alert
完全可行,针对Mac平台的SwiftUI应用,你可以通过自定义视图修饰符实现全局Alert,它能覆盖当前视图以及该视图弹出的Sheet/Alert,但无法覆盖子视图弹出的Sheet。
使用方式
在根视图(或你希望覆盖的视图层级顶部)应用以下修饰符:
MyView() .modifier(AlertPresenter())
实现代码
struct AlertPresenter: ViewModifier { @StateObject var alertViewModel: AlertViewModel = AlertViewModel() func body(content: Content) -> some View { content .alert(alertViewModel.errorTitle, isPresented: $alertViewModel.showError, actions: { Button("Ok") { alertViewModel.showError = false } }, message: { Text(alertViewModel.errorMessage) }) } } class AlertViewModel: ObservableObject { @Published var showError: Bool = false @Published var errorTitle: String = "An Error Occurred!" @Published var errorMessage: String = unknownString // 需提前定义该字符串常量 init() { NotificationCenter.default.addObserver(self, selector: #selector(errorOccurred), name: errorOccurredNotificationName, object: nil) // 需提前定义通知名称常量 } @objc func errorOccurred(_ notification: Notification) { guard let error = notification.object as? Error else { return } errorMessage = error.localizedDescription showError = true } }
工作原理
- 通过
ViewModifier将Alert绑定到目标视图层级,利用SwiftUI的视图层级优先级,让该Alert覆盖当前视图及它弹出的Sheet/Alert - 借助
NotificationCenter实现全局触发:在应用任意位置发送errorOccurredNotificationName通知并携带Error对象,即可触发全局Alert AlertViewModel作为状态管理对象,负责接收通知、更新Alert状态
内容的提问来源于stack exchange,提问作者Frederik Mrozek
相关产品推荐
相关产品推荐

