如何从 ContentView 外部显示 SwiftUI 警报?

How do I display a SwiftUI alert from outside of the ContentView?

我正在构建一个 Swift 应用程序,并且正在尝试弄清楚如何显示警报。我有一个单独的 swift 文件正在做一些计算,在某些情况下我希望它向用户显示一个警报,基本上告诉他们出了什么问题。但是,我看到的大多数示例都要求警报位于 ContentView 内或以其他方式连接到视图,而且我无法弄清楚如何从任何视图之外的单独文件显示警报。

我见过的大多数例子都是这样的:

struct ContentView: View {
@State private var showingAlert = false

var body: some View {
    Button("Show Alert") {
        showingAlert = true
    }
    .alert("Important message", isPresented: $showingAlert) {
        Button("OK", role: .cancel) { }
    }
}}

如果我对您的问题的理解正确,您希望在计算中出现某些情况时在 UI 上显示 alert。 计算发生在代码中其他地方的地方,例如监控传感器的任务。

这里我提出了一种方法,如示例代码所示,使用 NotificationCenter。无论何时何地,在您的代码中,发送一个 NotificationCenter.default.post... 作为示例代码,然后将弹出警报。

class SomeClass {
    static let showAlertMsg = Notification.Name("ALERT_MSG")
    
    init() {
        doCalculations() // simulate showing the alert in 2 secs
    }
    
    func doCalculations() {
        //.... do calculations
        // then send a message to show the alert in the Views "listening" for it
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            NotificationCenter.default.post(name: SomeClass.showAlertMsg, object: nil)
        }
    }
}

struct ContentView: View {
    let calc = SomeClass() // for testing, does not have to be in this View
    @State private var showingAlert = false
    
    var body: some View {
        Text("calculating...")
            .alert("Important message", isPresented: $showingAlert) {
                Button("OK", role: .cancel) { }
            }
            // when receiving the msg from "outside"
            .onReceive(NotificationCenter.default.publisher(for: SomeClass.showAlertMsg)) { msg in
                self.showingAlert = true // simply change the state of the View
            }
    }
}