【问题标题】:How to display SwiftUI Alert on top of all other Views and Sheets (MacOS)如何在所有其他视图和表格之上显示 SwiftUI 警报 (MacOS)
【发布时间】:2023-01-19 11:40:04
【问题描述】:

我试图在当时打开的所有其他视图和工作表或警报之上全局显示 Alert,因此我可以显示程序运行时随时可能发生的全局相关错误。这可能吗?我的程序是针对 Mac 的,所以 UIKit 解决方法不起作用...提前致谢 :)

您可以在任何视图上应用以下修饰符,它将在该视图以及在此视图中创建的其他工作表和警报的顶部显示错误,但不会在子视图中创建的那些工作表的顶部显示错误。

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
    }
}

【问题讨论】:

  • 一些观察:每次使用 .modifier(AlertPresenter()) 时,它都会创建一个新的 AlertViewModel()。您可以尝试使用 zIndex(...) 将警报置于其他视图之上。
  • 谢谢,我现在已经尝试了zIndex(...),但在这种情况下不起作用。我现在已经以一种不太优雅的方式解决了我的具体问题,但是仍然非常欢迎我如何正确地做到这一点的任何想法......

标签: swiftui popup alert global


【解决方案1】:

而不是使用修饰符。也许你可以这样做:

extension View {
    @ViewBuilder func errorAlert(error: Binding<Error?>, buttonTitle: LocalizedStringKey = "xloc.generic.ok", action: (() -> Void)? = nil) -> some View {
        let localizedAlertError = LocalizedAlertError(error: error.wrappedValue)
        alert(isPresented: .constant(localizedAlertError != nil), error: localizedAlertError) { _ in
            Button(buttonTitle) {
                action?()
                error.wrappedValue = nil
            }
        } message: { error in
            Text(error.failureReason ?? error.recoverySuggestion ?? "")
        }
    }
}

您将能够像调用 .alert() 一样显示错误警报。这是你想做的事吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2019-08-20
    • 2022-11-07
    • 2020-04-04
    • 2021-08-11
    • 2021-09-08
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多