2016-12-05 196 views
4

我想使用位置數據製作一個簡單的iOS應用程序。不幸的是,即使在模擬器上輸入「當前位置」調試代碼,在設備和模擬器上同時測試時,我也會收到'無'。 這是我第一次在Swift 3上使用CoreLocation,所以我使用了和前面一樣的方法。位置快速問題3

import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 

    @IBOutlet weak var latitudeLabel: UILabel! 
    @IBOutlet weak var longitudeLabel: UILabel! 

    var locationManager:CLLocationManager? 
    var currentLocation:CLLocation? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.requestAlwaysAuthorization() 
     locationManager.startUpdatingLocation() 
     updateLabels() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     self.currentLocation = locations[0] 
    } 

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 
     print(error) 
    } 

    func updateLabels() { 
     latitudeLabel.text = String(describing: currentLocation?.coordinate.latitude) 
     longitudeLabel.text = String(describing: currentLocation?.coordinate.longitude) 
     print(currentLocation) 
} 

} 

當然,我已經在Info.plist中編寫了所有必要的隱私密鑰。

當我試圖打印currentLocation時,我收到零。 隨着最後一次發佈,我發現這樣的問題,而不是一個警報正在出現,但立即消失

+0

你說的「我接受‘零’」是什麼意思?請澄清你的問題。 – rmaddy

+0

感謝您的回覆。編輯說明。 –

回答

4

viewDidLoad您正在將CLLocationManager保存在本地變量中,但從未將它保存到您的屬性中。因此,它已經超出了範圍並被取消分配,可能永遠不會調用你的委託方法。

要麼直接更新您的屬性,要麼完成配置您的位置管理器後,請確保執行self.locationManager = locationManager。我可能會直接更新:

override func viewDidLoad() { 
    super.viewDidLoad() 

    locationManager = CLLocationManager() 
    locationManager?.delegate = self 
    locationManager?.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager?.requestAlwaysAuthorization() 
    locationManager?.startUpdatingLocation() 
    // updateLabels() 
} 

然後,當rmaddy指出,在didUpdateLocations更新您的標籤:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    guard let location = locations.last, location.horizontalAccuracy >= 0 else { return } 

    currentLocation = location 
    updateLabels() 
} 
1

您正在呼叫updateLabels從錯誤的地方。您需要從locationManager(_:didUpdateLocations)方法中調用它。由於該委託方法可能會在後臺線程中調用,因此請確保使用DispatchQueue.main.async將調用包裝爲updateLabels