簡體   English   中英

如何在 swiftui 中顯示來自自定義 class 的警報?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM