Где разместить делегатов CLLocationManager с помощью Swift UI? - PullRequest
0 голосов
/ 21 января 2020

Я работал и выключался в Swift на протяжении многих лет, поэтому, извините, если я делаю что-то глупое, пользовательский интерфейс Swift также не помогает моему замешательству. У меня есть код, с которым я работаю, внизу.

Итак, я делаю приложение Geofencing, используя SwiftUI, у меня есть основы и все работает, но я все еще имею немного до go ,

  • У меня есть координаты геозон и прочее внутри переменной среды UserData, которую я получаю json в другом месте.

  • Есть SwiftUI объект, который имеет карту с текущей позицией и инициализирует CLLocationManager для работы с геозоной.

Я пытаюсь реализовать делегат в том же файле с помощью

locationManager.delegate = self

в setupManager (),

, но это вызовет

Cannot assign value of type 'GeofencingView' to type 'CLLocationManagerDelegate?'

Отсутствие информации SwiftUI, определяющей c информацию в Интернете, кажется, вызывает наибольшую путаницу для меня на В данный момент я думаю, что я должен сделать следующее:

  1. создать настроенный NsObject, который обрабатывает делегаты, но в этом случае я не уверен, как передать @ EnviromentObject
  2. Найти как разместить делегатов на UIViewRep resentable object.

Буду признателен за любые указания на то, что я делаю неправильно.

import SwiftUI
import MapKit
import CoreLocation

struct GeofencingView: UIViewRepresentable {

    @EnvironmentObject var userData: UserData

    var notification = LocalNotificationManager()

    var locationManager = CLLocationManager()

    func setupManager() {

      locationManager.desiredAccuracy = kCLLocationAccuracyBest
      locationManager.requestWhenInUseAuthorization()
      locationManager.requestAlwaysAuthorization()

        self.startGoefenceMonitoring()
    }


    func startGoefenceMonitoring() {

        print("MapListView::startGeofenceMonitoring")



        for landmark in self.userData.landmarks {

            let moniteringCordinate = CLLocationCoordinate2DMake(landmark.locationCoordinate.longitude, landmark.locationCoordinate.latitude)
            let moniteringRegion = CLCircularRegion.init(center: moniteringCordinate, radius: 20.0, identifier: "\(landmark.id)" )
            locationManager.startMonitoring(for: moniteringRegion)

        }
    }

    func makeUIView(context: Context) -> MKMapView {

      setupManager()
      let mapView = MKMapView(frame: UIScreen.main.bounds)
      let count = self.userData.landmarks.count
      var annotationArray: [MKAnnotation] = []
      var num:Int = 0


      mapView.showsUserLocation = true
      mapView.userTrackingMode = .follow        

      return mapView
    }

    func updateUIView(_ uiView: MKMapView, context: Context) {

    }
}

struct GeofencingView_Preview: PreviewProvider {
    static var previews: some View {
        GeofencingView()
            .environmentObject(UserData())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...