【问题标题】:SwiftUI if network not connected如果网络未连接,则为 SwiftUI
【发布时间】:2021-07-30 22:39:00
【问题描述】:

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

  • 网络问题
  • 服务器中断

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

这个想法是一个弹出屏幕,在用户连接到 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.

【问题讨论】:

标签: swift xcode swiftui


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 2017-03-27
    • 1970-01-01
    • 2019-03-07
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多