swift - 如果网络未连接,则为 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.
解决方案
在 SwiftUI 视图中声明 an@EnvironmentObject
可以获得对现有环境对象的引用,但首先,您必须创建它并将其添加到环境中。
对于可以在应用程序中的任何位置访问的代码,可能最好的位置是在应用程序层。假设您使用的是 SwiftUI 应用程序生命周期,它可能看起来像这样:
struct MyApp: App {
@StateObject private var monitor = Monitor()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(monitor)
}
}
}
只要您的视图是 的子级,他们就可以通过声明ContentView()
访问您的Monitor
实例。@EnvironmentObject
推荐阅读
- php - 通过带有 PHP 代码的 Web 服务器将本地文件从应用程序上传到 FTP 服务器
- java - 使用流 API 将 arraylist 添加到 arraylist
- java - 转换为组合参数类型的数组
- java - Java regex 获取所有匹配的组
- rest - 在 open.mapquestapi.com 上进行 4GL GET 请求
- sql-server - 如何使用 sql 在文件服务器上查找图像的高度和宽度
- css - Laravel 分页活动页面出现无样式
- sql - 在 Visual Studio 中访问 SQL 子查询返回 0
- azure-keyvault - Azure 容器实例无法访问密钥保管库
- java - 字节与字符串的奇怪转换