因此,我认为,如果出于任何原因,用户无法访问我们的服务器,请执行以下操作:
我需要它来展示这个观点。目前,我不得不通过一个错误,如果它不能访问我们的服务器,但我想知道他们是一个连接或未连接的网络之前,它甚至尝试我们的网站。
这个想法是一个弹出屏幕,直到用户连接到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.发布于 2021-05-09 07:12:25
在@EnvironmentObject视图中声明SwiftUI将获得对现有环境对象的引用,但首先必须创建它并将其添加到环境中。
对于应用程序中任何地方都可以访问的代码,最好的位置是在应用程序层。假设您使用的是SwiftUI应用程序生命周期,它可能如下所示:
struct MyApp: App {
@StateObject private var monitor = Monitor()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(monitor)
}
}
}只要您的视图是ContentView()的子视图,它们就可以通过@EnvironmentObject声明访问您的Monitor实例。
https://stackoverflow.com/questions/67454967
复制相似问题