Как получить доступ к базовому GMSMapView из UIRepresentable MapView - PullRequest
0 голосов
/ 27 апреля 2020

В моем приложении у меня есть класс ViewModel (MapViewModel), класс UIRepresentable и ContentView. Я ищу способ получить доступ к представлению GMSMapView в ViewModel, который создан как класс UIRepresentable.

ContentView.swift:

import SwiftUI
import Combine

struct ContentView: View {
    @State private var selection = 0
    @State private var dragOffset = CGSize.zero
    @ObservedObject var mapViewModel : MapViewModel = MapViewModel()

    var body: some View {
        GeometryReader { geo in
            TabView(selection: self.$selection) {
                MapView()
                    .edgesIgnoringSafeArea(.all)
                    .tabItem {
                        VStack {
                            Image(systemName: "house")
                            Text("Home")
                        }
                }
                .tag(0)

                Text("Second Page")

                    .tabItem {
                        VStack {
                            Image(systemName: "gear")
                            Text("Settings")
                        }
                }
                .tag(1)

                Text("Third Page")

                    .tabItem {
                        VStack {
                            Image(systemName: "gear")
                            Text("Third Page")
                        }
                }
                .tag(2)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

MapViewModel.swift:

import Foundation
import Combine
import GoogleMaps
import os

class MapViewModel: NSObject, ObservableObject {

    let lm = CLLocationManager()
    var myLocations =  [CLLocation]()


    override init() {

        super.init()

        lm.delegate = self
        lm.desiredAccuracy = kCLLocationAccuracyBest
        lm.requestWhenInUseAuthorization()
        lm.pausesLocationUpdatesAutomatically = false
        lm.allowsBackgroundLocationUpdates = true
        lm.startUpdatingLocation()

    }

}

extension MapViewModel: CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        //self.status = status

    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        os_log("locationManager:didUpdateLocations: received location",log: Log.general, type: .debug)
    }
}

MapView.swift:

import UIKit
import SwiftUI
import GoogleMaps

struct MapView: UIViewRepresentable {

    func makeUIView(context: Context) -> GMSMapView {

        let camera = GMSCameraPosition.camera(withLatitude: 30.267153, longitude: -97.7430608, zoom: 6.0)
        let gmsMapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        gmsMapView.delegate = context.coordinator
        return gmsMapView
    }

    func updateUIView(_ mapView: GMSMapView, context: Self.Context) {

    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, GMSMapViewDelegate {
        var parent: MapView

        init(_ parent: MapView) {
            self.parent = parent
        }       
    }
}

struct GoogleMapView_Previews: PreviewProvider {
    static var previews: some View {
        MapView()
    }
}

Так что любая идея о том, как я могу получить доступ к объекту gmsMapView в MapViewModel. Мне нужен доступ для рисования линий на карте ... Спасибо!

...