如何在 swiftui 中显示来自自定义 class 的警报?
How do I present an alert from a custom class in swiftui?
在 SwiftUI 中,我在 scenedelegate 中有一个网络请求 运行,scenedidbecomeactive。我不知道当应用程序激活时用户将使用哪个视图,但我想在网络请求中的数据发生变化时发出警报。我简化了下面的代码,所以它很容易阅读...
func sceneDidBecomeActive(_ scene: UIScene) {
let customClass = CustomClass()
customClass.performNetworkRequest()
在 CustomClass 中,我有...
func performNetWorkRequest() {
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let d = data {
let response = try JSONDecoder().decode(DetailResponse.self, from: d)
DispatchQueue.main.async {
//Here is where I want to either present an alert, but I can't figure out how to.
//OR do i put a func in SceneDeletegate to present the alert on the window.rootviewcontroller and then just call that func from here?
}
非常感谢任何帮助!
Paul 说的有道理 - 这是一个可能的实现方式:
// In CustomClass.swift
import Combine
class CustomClass : ObservableObject {
@Published var dataRecieved = PassthroughSubject<DetailResponse, Never>()
init() {
performNetWorkRequest()
}
func performNetWorkRequest() {
URLSession.shared.dataTask(with: url) { (data, response, error) in
let response = try JSONDecoder().decode(DetailResponse.self, from: data)
DispatchQueue.main.async {
self.dataRecieved.send(response)
}
}
.resume()
}
}
// In SomeView.swift
import SwiftUI
import Combine
struct ContentView: View {
@State var showAlert = false
var customClass = CustomClass()
var body: some View {
Text("Hello, World!")
.onReceive(customClass.dataRecieved) { _ in
self.showAlert = true
}
.alert(isPresented: $showAlert) {
// your alert
}
}
}
请注意,我没有在其中任何一个中提到 SceneDelegate - 在我看来,这种方法(称为 MVVM)更灵活 - 此外,它的设置方式 performNetWorkRequest()
无论如何,将在您的视图初始化后立即执行。
您还可以调整 PassthroughSubject
- 我不知道您是否需要 DetailResponse
。
希望这对您有所帮助!
编辑:
我刚刚重读了您的问题,您注意到此实现似乎有问题,因为无法知道在网络发生变化的情况下用户会看到什么视图。在这种情况下,您可以在 SceneDelegate
中提供与 EnvironmentObject
.
相同的 CustomClass
实例
在 SwiftUI 中,我在 scenedelegate 中有一个网络请求 运行,scenedidbecomeactive。我不知道当应用程序激活时用户将使用哪个视图,但我想在网络请求中的数据发生变化时发出警报。我简化了下面的代码,所以它很容易阅读...
func sceneDidBecomeActive(_ scene: UIScene) {
let customClass = CustomClass()
customClass.performNetworkRequest()
在 CustomClass 中,我有...
func performNetWorkRequest() {
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let d = data {
let response = try JSONDecoder().decode(DetailResponse.self, from: d)
DispatchQueue.main.async {
//Here is where I want to either present an alert, but I can't figure out how to.
//OR do i put a func in SceneDeletegate to present the alert on the window.rootviewcontroller and then just call that func from here?
}
非常感谢任何帮助!
Paul 说的有道理 - 这是一个可能的实现方式:
// In CustomClass.swift
import Combine
class CustomClass : ObservableObject {
@Published var dataRecieved = PassthroughSubject<DetailResponse, Never>()
init() {
performNetWorkRequest()
}
func performNetWorkRequest() {
URLSession.shared.dataTask(with: url) { (data, response, error) in
let response = try JSONDecoder().decode(DetailResponse.self, from: data)
DispatchQueue.main.async {
self.dataRecieved.send(response)
}
}
.resume()
}
}
// In SomeView.swift
import SwiftUI
import Combine
struct ContentView: View {
@State var showAlert = false
var customClass = CustomClass()
var body: some View {
Text("Hello, World!")
.onReceive(customClass.dataRecieved) { _ in
self.showAlert = true
}
.alert(isPresented: $showAlert) {
// your alert
}
}
}
请注意,我没有在其中任何一个中提到 SceneDelegate - 在我看来,这种方法(称为 MVVM)更灵活 - 此外,它的设置方式 performNetWorkRequest()
无论如何,将在您的视图初始化后立即执行。
您还可以调整 PassthroughSubject
- 我不知道您是否需要 DetailResponse
。
希望这对您有所帮助!
编辑:
我刚刚重读了您的问题,您注意到此实现似乎有问题,因为无法知道在网络发生变化的情况下用户会看到什么视图。在这种情况下,您可以在 SceneDelegate
中提供与 EnvironmentObject
.
CustomClass
实例