swift - 尝试在 func makeCoordinator() 中访问 EnviromentObject
问题描述
我正在尝试连续计算在 ContentView 中输入固定纬度/经度的距离(来自:the_userLocation)。我可以在 func 中执行一次,struct MapView: UIViewRepresentable {
但我想进行连续计算。我以为我可以在
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation)
里面
做这个class MapViewCoordinator: NSObject, MKMapViewDelegate
我在一个文件中定义了 EnvironmentObject
import SwiftUI
final class AppData: ObservableObject { // Don't know why final
@Published var cornerLatitude: String = ""
@Published var cornerLongitude: String = ""
@Published var corner: Int = 1
}
在 MapView 文件的顶部,我包含了 EnvironmentObject
import MapKit
struct MapView: UIViewRepresentable {
@EnvironmentObject var appData: AppData
var map = MKMapView()
var locationManager: CLLocationManager!
init() {
locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
}
在 MapViewCoordinator func mapView 类中,如果我取消注释let cornerLat =
和let cornerLon =
行,我会收到错误
Instance member 'appData' of type 'MapView' cannot be used on instance of nested type 'MapView.MapViewCoordinator'
我已经尝试过其他类似结果的代码“组合”。
let map: MKMapView
init(map:MKMapView) {
self.map = map
}
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
let location = map.userLocation
let region = MKCoordinateRegion(center: location.coordinate, latitudinalMeters: 500, longitudinalMeters: 500)
map.setRegion(region, animated: true)
// let cornerLat = Double(appData.cornerLatitude) ?? 0.0
// let cornerLon = Double(appData.cornerLongitude) ?? 0.0
}
}
任何想法/建议。谢谢
解决方案
如果我正确理解提供的代码,那么您可以执行以下操作(因为 AppData 是引用类型)
Scratchy(未经测试,只是想法)
class MapViewCoordinator {
let map: MKMapView
let appData: AppData // here !!
init(map:MKMapView, appData: AppData) {
self.map = map
self.appData = appData // << here !!
}
// ... use where needed as own property
并创建
struct MapView: UIViewRepresentable {
@EnvironmentObject var appData: AppData
var map = MKMapView()
...
func makeCoordinator() -> MapViewCoordinator {
MapViewCoordinator(map: map, appData: appData) // << inject !!
}
推荐阅读
- jquery - event.preventDefault(); 无法在 ajax post laravel Framework 5.8.17 中工作
- c# - .NET Core 但不是 .NET Framework 的 400 BadRequest 响应
- javascript - 在下面的所有 div 上使用 css 模糊效果
- beagleboneblack - 在 BeagleBone Black 上读取、加载和卸载驱动程序的命令?
- php - PHP:来自 ZipArchive::statIndex() 的 CRC 是否足够独特,可用于检测许多 zip 中的重复文件?
- c - Fgets does not read from given location
- exception - Grails4 - 在上传文件时捕获文件 maxFileSize 限制
- accessibility - 可访问性:带有 ajax 的模态表单
- mongodb - 在 mongodb 中插入行时出错?
- css - “before”和“after”伪元素在活动状态下被包装器 div 重叠