如何从 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
}
}
}
我正在构建一个 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
}
}
}