由于某种原因didUpdateLocations
未被调用,即使我将委托设置为视图控制器也是如此。在info.plist
中,我将密钥Privacy - Location When In Use Usage Description
设置为说明。所以我不确定我做错了什么?
import MapKit
import CoreLocation
class OptionsViewController: UIViewController, UITableViewDelegate, CLLocationManagerDelegate {
override func viewDidLoad() {
//Ask user for location
locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
//Use users current location if no starting point set
if CLLocationManager.locationServicesEnabled() {
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
}
}
override func viewDidAppear(_ animated: Bool) {
locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error){
locationManager.stopUpdatingLocation()
print(error)
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("Did update location called?")
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
}
答案 0 :(得分:0)
问题出在这里:
override func viewDidAppear(_ animated: Bool) {
locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
}
此方法将在viewDidLoad
之后调用,但是您之后在viewDidAppear
中创建了一个locationManager,并且没有将其委托指向self。这就是为什么委托(自我)的方法不被调用的原因。
改进但不是最好的方法是:
class OptionsViewController: UIViewController, UITableViewDelegate, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
//Ask user for location
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
//Use users current location if no starting point set
if CLLocationManager.locationServicesEnabled() {
if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse
|| CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways {
locationManager.startUpdatingLocation()
}
else{
locationManager.requestWhenInUseAuthorization()
}
}
else{
//Alert user to open location service, bra bra bra here...
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//... nothing need to do for location here
}
public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.authorizedWhenInUse
|| status == CLAuthorizationStatus.authorizedAlways {
locationManager.startUpdatingLocation()
}
else{
//other procedures when location service is not permitted.
}
}
//......
}