Попытка получить доступ к EnviromentObject внутри fun c makeCoordinator () - PullRequest
1 голос
/ 08 июля 2020

Я пытаюсь постоянно вычислять расстояние (from: the_userLocation), на котором фиксированные широта / долгота вводятся в ContentView. Я могу сделать это один раз, забавно c внутри 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 fun c 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

        }
    }

Любые мысли / предложения. Спасибо

1 Ответ

0 голосов
/ 08 июля 2020

Если я правильно понимаю предоставленный код, вы можете сделать следующее (поскольку 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 !!
    }
...