[英]How do I present an alert from a custom class in swiftui?
在 SwiftUI 中,我在 scenedelegate 中運行了一個網絡請求,scenedid 變得活躍。 我不知道當應用程序處於活動狀態時用戶將使用哪個視圖,但我想在網絡請求中的數據發生變化時發出警報。 我簡化了下面的代碼,所以很容易閱讀......
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?
}
任何幫助深表感謝!
保羅有一點 - 這是一個可能的實現:
// 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
中將相同的CustomClass
實例作為EnvironmentObject
提供。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.