2016-11-16 16 views
0

我正在爲我的課程之一的應用程序。它應該跟蹤旅行的距離並更新標籤以顯示他們走了多遠。當我打開應用程序時,它會要求獲得跟蹤位置的權限。 mapView的工作原理是,它遵循位置,但標籤永不更新以顯示行進距離。我在下面添加了我的代碼,非常感謝任何幫助!位置正在工作,但它不跟蹤我在斯威夫特3旅行distrance

// 
    // ViewController.swift 
    // location_tracker 
    // 
    // Created by Dale McCaughan on 2016-10-19. 
    // Copyright © 2016 Dale McCaughan. All rights reserved. 
    // 

    import UIKit 
    import CoreLocation 
    import MapKit 

    class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { 

    @IBOutlet weak var theMap: MKMapView! 
    @IBOutlet weak var l: UILabel! 

    let locationManager = CLLocationManager() 
    var startLocation: CLLocation! 
    var monitoredRegions: Dictionary<String, NSDate> = [:] 

    override func viewWillAppear(_ animated: Bool) { 
     self.navigationController?.isNavigationBarHidden = true 
     self.navigationController?.isToolbarHidden = false; 

    //Status bar style and visibility 
    UIApplication.shared.statusBarStyle = .lightContent 

    //Change status bar color 
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView 
    //if statusBar.respondsToSelector("setBackgroundColor:") { 
    statusBar.backgroundColor = UIColor.white 
    //} 

    UIToolbar.appearance().backgroundColor = UIColor.white 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Setup the Location Manager 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

    //Setup the Map View 
    theMap.delegate = self 
    theMap.showsUserLocation = true 
    theMap.userTrackingMode = .follow 

    // setup test data 

} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    // status is not determined 
    if CLLocationManager.authorizationStatus() == .notDetermined { 
     locationManager.requestAlwaysAuthorization() 
    } 
     // authorization were denied 
    else if CLLocationManager.authorizationStatus() == .denied { 
     showAlert("Location services were previously denied. Please enable location services for this app in Settings.") 
    } 
     // we do have authorization 
    else if CLLocationManager.authorizationStatus() == .authorizedAlways { 
     locationManager.startUpdatingLocation() 
    } 
} 

// MARK: - MKMapViewDelegate 

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 
    let circleRenderer = MKCircleRenderer(overlay: overlay) 
    circleRenderer.strokeColor = UIColor.red 
    circleRenderer.lineWidth = 1.0 
    return circleRenderer 
} 

@IBAction func resetDistance(_ sender: AnyObject) { 
    startLocation = nil 
} 

// MARK: - CLLocationManagerDelegate 

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) { 
    showAlert("enter \(region.identifier)") 
    monitoredRegions[region.identifier] = Date() as NSDate? 
    l.text = "in location manager1" 
} 

func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) { 
    showAlert("exit \(region.identifier)") 
    monitoredRegions.removeValue(forKey: region.identifier) 
    l.text = "in location manager2" 
} 

var lastLocation: CLLocation! 
var traveledDistance:Double = 0 

func locationManager(manager:CLLocationManager, didUpdateLocations locations:[AnyObject]) { 

    if let firstLocation = locations.first as? CLLocation 
    { 
     theMap.setCenter(firstLocation.coordinate, animated: true) 

     let region = MKCoordinateRegionMakeWithDistance(firstLocation.coordinate, 1000, 1000) 
     theMap.setRegion(region, animated: true) 

     if let oldLocation = lastLocation { 
      let delta: CLLocationDistance = firstLocation.distance(from: lastLocation) 
      traveledDistance += delta 
     } 

     lastLocation = firstLocation 
    } 
    l.text = String(format: "%.3f", traveledDistance/1000) + " kilometers" 

} 

// MARK: - Helpers 

func showAlert(_ title: String) { 
    let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert) 
    alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in 
     alert.dismiss(animated: true, completion: nil) 
    })) 
    self.present(alert, animated: true, completion: nil) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
} 
+0

您是否已經完成了任何調試以查看代碼完全打破的位置?在目前的形式下,這對於SO問題來說太廣泛了,您需要更具體些。 –

回答

0

試試這個:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let firstLocation = locations.first 

您正在使用的委託簽名是不太什麼代表一直在尋找。簽名更正後,您不需要as CLLocation演員了。

我證實它可以與該更改一起使用。爲了將來的參考,你可以在didUpdateLocations中設置一個斷點,你會馬上看到它沒有被調用,然後從那裏向後工作。

此外請確保Info.plist包含所有必要的位置相關的隱私字符串(我通常只是在所有三個涵蓋所有基地)。