Добавить CLLocationManagerDelegate в отдельный класс - PullRequest
1 голос
/ 16 февраля 2020

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

Моя цель - вызывать мой класс LocationHandler каждый раз, когда я хочу узнать местоположение пользователя и большую часть раз я хотел бы обрабатывать местоположение по-другому (например, просто сохранить его как есть или в другой раз проверить местоположение и, если оно соответствует определенным правилам, сохранить его и т. д. c ...)

Я хотел бы передайте функцию моему классу LocationHandler, если возможно обработать изменение местоположения.

примерно так: (это просто псевдокод, я не знаю, как это сделать правильно в swift )

let locationHandler = LocationHandler ()

locationHandler.handleLocationChange = (location: [CLLocation]) -> {...}

locationHandler.getCurrentLocation ()

Моя первая проблема - когда я создаю экземпляр из моего LocationHandler, функция getCurrentLocation работает правильно, но didUpdateLocations никогда не повышается (я думаю, что это так что-то с делегацией)

Во-вторых, я понятия не имею, как передать функцию в класс в качестве параметра

, вот мой класс LocationHandler

import Foundation
import CoreLocation

class LocationHandler: NSObject, CLLocationManagerDelegate{

    let locationManager = CLLocationManager()


    override init(){
        super.init()

        locationManager.delegate = self

    }

    func getCurrentLocation(){

        if CLLocationManager.locationServicesEnabled() {
            switch CLLocationManager.authorizationStatus() {
                case .notDetermined, .restricted, .denied:
                    print("No access")
                case .authorizedAlways, .authorizedWhenInUse:
                    print("Access")
                @unknown default:
                break
            }
            } else {
                print("Location services are not enabled")
        }


        locationManager.requestWhenInUseAuthorization()
        locationManager.requestLocation()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
          if let location = locations.first {
              print("Found user's location: \(location)")
              //do something with the location
          }
      }

      func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
          print("Failed to find user's location: \(error.localizedDescription)")
      }



}

, и я используйте его в viewcontroller следующим образом:

  let locationHandler = LocationHandler()
  locationHandler.getCurrentLocation()

1 Ответ

0 голосов
/ 16 февраля 2020

Как написано, вы должны убедиться, что экземпляр LocationHandler является свойством контроллера представления, а не локальной переменной. Вы хотите убедиться, что он не выпадает из области видимости и освобождается до того, как у метода делегата будет возможность вызвать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...