首页 > 解决方案 > 如果网络未连接,则为 SwiftUI

问题描述

所以我认为,如果出于某种原因用户无法访问我们的服务器,可能是因为:

我需要它来显示这个视图。目前,如果它无法访问我们的服务器,我必须通过错误来执行此操作,但是我想知道它们是连接还是未连接的网络,然后才能尝试我们的网站。

这个想法是一个弹出屏幕,直到用户连接到 wifi 或手机接收。

但是我已经尝试过这段代码:

import Network
import SwiftUI

// An enum to handle the network status
enum NetworkStatus: String {
    case connected
    case disconnected
}

class Monitor: ObservableObject {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "Monitor")

    @Published var status: NetworkStatus = .connected
  
    init() {
        monitor.pathUpdateHandler = { [weak self] path in
            guard let self = self else { return }

            // Monitor runs on a background thread so we need to publish
            // on the main thread
            DispatchQueue.main.async {
                if path.status == .satisfied {
                    print("We're connected!")
                    self.status = .connected
                  

                } else {
                    print("No connection.")
                    self.status = .disconnected
                }
            }
        }
        monitor.start(queue: queue)
    }
}

然后我将以下内容添加到我的 SwiftUI

struct ContentView: SwiftUI.View {
    @EnvironmentObject var monitor: Monitor
    
    init() {
      
    }

 var body: some SwiftUI.View {
HStack{
Text("HELLO WORLD")
}.onAppear{
print(monitor.status)
}
}

但是它使应用程序崩溃,并出现以下错误

SwiftUI:0: Fatal error: No ObservableObject of type Monitor found. A View.environmentObject(_:) for Monitor may be missing as an ancestor of this view.

标签: swiftxcodeswiftui

解决方案


在 SwiftUI 视图中声明 an@EnvironmentObject可以获得对现有环境对象的引用,但首先,您必须创建它并将其添加到环境中。

对于可以在应用程序中的任何位置访问的代码,可能最好的位置是在应用程序层。假设您使用的是 SwiftUI 应用程序生命周期,它可能看起来像这样:

struct MyApp: App {
  @StateObject private var monitor = Monitor()

  var body: some Scene {
    WindowGroup {
      ContentView()
        .environmentObject(monitor)
    }
  }
}

只要您的视图是 的子级,他们就可以通过声明ContentView()访问您的Monitor实例。@EnvironmentObject


推荐阅读