所以我认为,如果用户出于任何原因无法访问我们的服务器,无论是因为什么原因:
- 网络问题
- 服务器中断
我需要它来显示此视图。目前,如果它无法访问我们的服务器,我必须通过错误来完成这项工作,但我想在它尝试我们的网站之前知道它们是连接的还是未连接的网络。
这个想法是一个弹出屏幕,显示直到用户连接到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.
在SwiftUI视图中声明@EnvironmentObject
可以获得对现有环境对象的引用,但首先,必须创建它并将其添加到环境中。
对于可以在应用程序中的任何位置访问的代码,最好的位置可能是在应用程序层。假设你使用的是SwiftUI应用程序的生命周期,它可能看起来像这样:
struct MyApp: App {
@StateObject private var monitor = Monitor()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(monitor)
}
}
}
只要您的视图是ContentView()
的子视图,它们就可以通过@EnvironmentObject
声明访问您的Monitor
实例。