如何以正确的方式跟踪设置locationManager.delegate?

时间:2018-01-28 14:03:04

标签: ios swift location core-location

我尝试使用CoreLocation和Swift来跟踪用户的位置:
(下面你可以找到可能的ViewController.swift文件的代码。

但代码似乎没有像我预期的那样有效,因为我每次启动应用程序时仍然会遇到相同的错误

Cannot assign value of type 'ViewController' to type 'CLLocationManagerDelegate?'

我确定这就是为什么我无法从应该打印出当前位置的locationManager()函数中获得结果的问题。

它说"Cannot assign value of type 'ViewController' to type 'CLLocationManagerDelegate?'"

import UIKit
import CoreLocation 

class ViewController: UIViewController, WKUIDelegate {
  override func viewDidLoad() {
    super.viewDidLoad()
    if CLLocationManager.locationServicesEnabled() {
        print("CLLocationManager is available")
        locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
        locationManager.delegate = self
        locationManager.startUpdatingLocation()
    }
  }

  let locationManager = CLLocationManager()

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

现在有人如何解决这个问题? - 非常感谢任何帮助,感谢提前一百万。

1 个答案:

答案 0 :(得分:5)

您只需要声明与CLLocationManagerDelegate的一致性。您可以直接在类声明中执行此操作,就像使用WKUIDelegateViewController的扩展名一样。

class ViewController: UIViewController, WKUIDelegate, CLLocationManagerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if CLLocationManager.locationServicesEnabled() {
            print("CLLocationManager is available")
            locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
            locationManager.delegate = self
            locationManager.startUpdatingLocation()
        }
    }

    let locationManager = CLLocationManager()

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

有了扩展名:

class ViewController: UIViewController, WKUIDelegate {
    let locationManager = CLLocationManager()
    override func viewDidLoad() {
        super.viewDidLoad()
        if CLLocationManager.locationServicesEnabled() {
            print("CLLocationManager is available")
            locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
            locationManager.delegate = self
            locationManager.startUpdatingLocation()
        }
    }
}

extension ViewController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            print(location.coordinate)
        }
    }
}