首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI (如果网络未连接)

SwiftUI (如果网络未连接)
EN

Stack Overflow用户
提问于 2021-05-09 06:41:50
回答 1查看 597关注 0票数 1

因此,我认为,如果出于任何原因,用户无法访问我们的服务器,请执行以下操作:

  • 网络发出
  • 服务器中断

我需要它来展示这个观点。目前,我不得不通过一个错误,如果它不能访问我们的服务器,但我想知道他们是一个连接或未连接的网络之前,它甚至尝试我们的网站。

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

然而,我尝试过这样的代码:

代码语言:javascript
复制
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中

代码语言:javascript
复制
struct ContentView: SwiftUI.View {
    @EnvironmentObject var monitor: Monitor
    
    init() {
      
    }

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

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

代码语言:javascript
复制
SwiftUI:0: Fatal error: No ObservableObject of type Monitor found. A View.environmentObject(_:) for Monitor may be missing as an ancestor of this view.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-09 07:12:25

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

对于应用程序中任何地方都可以访问的代码,最好的位置是在应用程序层。假设您使用的是SwiftUI应用程序生命周期,它可能如下所示:

代码语言:javascript
复制
struct MyApp: App {
  @StateObject private var monitor = Monitor()

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67454967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档