Функции делегата CoreLocation не запускаются, пока не завершится функция viewDidLoad контроллера представления
Это более чем вероятно, что-то очень легко решить, но я занимался этим в течение некоторого времени и, похоже, не могу найти ответ.
Я хотел бы знать, почему метод делегата для CLLocationManager
не срабатывает, пока после ViewDidLoad
функция, когда CLLocationManager
загружен в пределах ViewDidLoad
функция.
Я установил для моего региона по умолчанию Сидней Австралия в своей схеме приложений и инкапсулировал свой locationManager в его собственный класс следующим образом:
import UIKit
import CoreLocation
/* Class location is a class to track user location and return a location object. */
class usrLocation: NSObject, CLLocationManagerDelegate
{
//MARK: Properties
var locationMgr: CLLocationManager!
var location: CLLocation!
var seenError: Bool = false
//MARK: Public Methods
func startTracking() {
locationMgr = CLLocationManager()
locationMgr.delegate = self
locationMgr.desiredAccuracy = kCLLocationAccuracyBest
locationMgr.requestWhenInUseAuthorization()
locationMgr.startUpdatingLocation()
}
//Return a location object
func getLocation() -> CLLocation {
locationMgr.startUpdatingLocation()
return location!
}
//MARK: CLLocationManagerDelegate
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
locationMgr.stopUpdatingLocation()
if (seenError == false) {
seenError = true
print(error)
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
location = (locations ).last
locationMgr.stopUpdatingLocation()
}
}
Я инициализировал класс в моем ViewController
и попробуйте начать отслеживать мое текущее местоположение в viewDidLoad
,
Код выглядит так.
override func viewDidLoad() {
var location = usrLocation()
override func viewDidLoad() {
super.viewDidLoad()
// Track location
location.startTracking()
location.getLocation()
//update Label text
sLongitude.text = "\(location.getLocation().coordinate.longitude)"
sLatitude.text = "\(location.getLocation().coordinate.latitude)"
}
getLocation()
никогда не возвращает местоположение, поскольку оно всегда равно нулю в качестве делегата didUpdateLocations
функция не работает. Почему это?
1 ответ
Я попытался заставить это работать, используя обработчик завершения, но не смог, поэтому мое решение состояло в том, чтобы игнорировать установку текста метки через viewDidLoad и вместо этого обновлять метки после того, как переменная местоположения была установлена. Таким образом, viewDidLoad завершается, делегат вызывается, а метки обновляются.
var location: CLLocation! {
didSet {
//update Label text
sLongitude.text = "\(location.getLocation().coordinate.longitude)"
sLatitude.text = "\(location.getLocation().coordinate.latitude)"
}
}