首页 > 解决方案 > 尝试在 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

        }
    }

任何想法/建议。谢谢

标签: swiftswiftuimapkit

解决方案


如果我正确理解提供的代码,那么您可以执行以下操作(因为 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 !!
    }

推荐阅读