これは非常に簡単に解決できるものですが、私はしばらくそれをしており、答えには見えません。CoreLocationビューコントローラviewDidLoad関数が終了するまで、デリゲート関数は実行されません。
私はCLLocationManager
ためのデリゲートメソッドがCLLocationManager
がViewDidLoad
関数内でロードされているViewDidLoad
機能後まで誘発しない理由を知っていただきたいと思います。
:
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
機能が実行されないよう、それは常にnilであるとして場所を返すことはありません。どうしてこれなの?
「CLLocationManager startUpdatingLocation()」メソッドのドキュメントをお読みください。 – rmaddy
@maddy、私は戻って 'CLLocationManager startUpdatingLocation()'のドキュメントを読んでいますが、viewControllers viewDidLoad()メソッド中にデリゲートが呼び出されない理由についてはまだ私の問題は解決していません。ドキュメントでは、startUpdatingLocation()が呼び出されるとすぐにデリゲートをすぐに実行する必要があることを示しています。多分私はここで間違ったアプローチをとっているだけでしょうか?私は完全な迅速な初心者ですので、そうであれば私には驚かないでしょう。 –
これは答えではありませんので、私はそのようにマークするつもりはありませんが、CoreLocationデリゲートが読み込まれない理由についての別の記事の説明があります。 [ビューが読み込まれる前に場所が更新されない](http://stackoverflow.com/questions/34585909/location-not-updating-before-the-view-loads)だから私はstartUpdatingLocation()関数が代理人をトリガーすると停止するアクティビティスピナーでこれを構築しようとします。 –