2017-01-13 5 views
0

これは非常に簡単に解決できるものですが、私はしばらくそれをしており、答えには見えません。CoreLocationビューコントローラviewDidLoad関数が終了するまで、デリゲート関数は実行されません。

私はCLLocationManagerためのデリゲートメソッドがCLLocationManagerViewDidLoad関数内でロードされている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機能が実行されないよう、それは常にnilであるとして場所を返すことはありません。どうしてこれなの?

+0

「CLLocationManager startUpdatingLocation()」メソッドのドキュメントをお読みください。 – rmaddy

+0

@maddy、私は戻って 'CLLocationManager startUpdatingLocation()'のドキュメントを読んでいますが、viewControllers viewDidLoad()メソッド中にデリゲートが呼び出されない理由についてはまだ私の問題は解決していません。ドキュメントでは、startUpdatingLocation()が呼び出されるとすぐにデリゲートをすぐに実行する必要があることを示しています。多分私はここで間違ったアプローチをとっているだけでしょうか?私は完全な迅速な初心者ですので、そうであれば私には驚かないでしょう。 –

+0

これは答えではありませんので、私はそのようにマークするつもりはありませんが、CoreLocationデリゲートが読み込まれない理由についての別の記事の説明があります。 [ビューが読み込まれる前に場所が更新されない](http://stackoverflow.com/questions/34585909/location-not-updating-before-the-view-loads)だから私はstartUpdatingLocation()関数が代理人をトリガーすると停止するアクティビティスピナーでこれを構築しようとします。 –

答えて

0

私はこれを補完ハンドラを使って動作させようとしましたが、私の解決策は、viewDidLoadでラベルテキストを設定することを無視し、代わりに位置変数が設定された後にラベルを更新することでした。このようにして、viewDidLoadが完了すると、デリゲートが呼び出され、ラベルが更新されます。

var location: CLLocation! { 

didSet { 
    //update Label text 
    sLongitude.text = "\(location.getLocation().coordinate.longitude)" 
    sLatitude.text = "\(location.getLocation().coordinate.latitude)"  
} 

} 
関連する問題