Swift 正在尝试在func makeCoordinator()中访问环境对象
我试图连续计算一个距离(从:用户位置),在ContentView中输入固定的lat/long。 我可以在Swift 正在尝试在func makeCoordinator()中访问环境对象,swift,swiftui,mapkit,Swift,Swiftui,Mapkit,我试图连续计算一个距离(从:用户位置),在ContentView中输入固定的lat/long。 我可以在struct MapView:UIViewRepresentable{中的func中做一次,但我想做一个连续的计算。我想我可以在内部做这件事 func映射视图(\mapView:MKMapView,didUpdate userLocation:MKUserLocation)inside 类MapViewCoordinator:NSObject,MKMapViewDelegate 我在一个文件中
struct MapView:UIViewRepresentable{
中的func中做一次,但我想做一个连续的计算。我想我可以在内部做这件事
func映射视图(\mapView:MKMapView,didUpdate userLocation:MKUserLocation)
inside
类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=
行,我将得到错误
不能在嵌套类型为“MapView.MapViewCoordinator”的实例上使用类型为“MapView”的实例成员“appData”
我尝试过其他类似结果的“组合”代码
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是引用类型) 发痒(未经测试,只是想法)
类MapViewCoordinator{
let map:MKMapView
让appData:appData//在这里!!
初始化(映射:MKMapView,appData:appData){
self.map=map
self.appData=appData//MapViewCoordinator{
MapViewCoordinator(map:map,appData:appData)//如果我正确理解提供的代码,那么您可以执行以下操作(因为appData是引用类型)
发痒(未经测试,只是想法)
类MapViewCoordinator{
let map:MKMapView
让appData:appData//在这里!!
初始化(映射:MKMapView,appData:appData){
self.map=map
self.appData=appData//MapViewCoordinator{
MapViewCoordinator(地图:地图,appData:appData)//非常好。谢谢。我想我希望@EnvironmentObject完成所有工作。但是,我已经将appData作为“参数”从ContentView传递给MapView中的func。非常好。谢谢。我想我希望@EnvironmentObject完成所有工作。但是,我已经将appData作为“参数”从Cont传递给func在MapView中将entView转换为func。
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 !!
}