首先:我知道这里也有类似的线索,但没有什么建议对我有效。
我想做的是:
我想要一个PositionController(类),它控制用户的当前位置,并为其他类、ViewControllers等提供使用信息的接口。
目前我已经实现了以下代码:
import Foundation
import CoreLocation
class PositionController: CLLocationManager, CLLocationManagerDelegate{
let locationManager: CLLocationManager
override init() {
self.locationManager = CLLocationManager()
print("---------------Init---------------------------")
}
func getPosition(){
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
locationManager.requestLocation()
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error)
}
func locationManager(_ mnager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(locations)
}
}
注意,委托函数中的print语句目前只是占位符。
还要注意,我希望从外部ViewControllers调用getPosition方法。但当我调用函数时,它只是通过代码块,而没有在最后调用两个委托函数中的任何一个。
此外,我有“使用时的隐私位置说明”和
“位置使用说明”已添加到我的plist中。
我真的不知道我错过了什么或做错了什么,所以我很感激所有的帮助
编辑:
import UIKit
import GoogleMaps
import GoogleMaps
class MapViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// For use in foreground
print("-----------------------In------------------------")
let positionController = PositionController()
positionController.getPosition()
print("-----------------------Out------------------------")
let camera = GMSCameraPosition.camera(withLatitude: 48.137154
longitude: 11.576124, zoom:12)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera:camera)
let marker = GMSMarker()
marker.position = camera.target
marker.snippet = "Munich"
marker.appearAnimation = GMSMarkerAnimation.pop
marker.map = mapView
self.view = mapView
}
最佳答案
您的问题是,您正在创建一个PositionController
实例作为viewDidLoad
中的局部变量。viewDidLoad
将退出,在位置回调获得一个执行的机会之前确定PositionController
实例(确定位置可能需要几秒钟甚至更长)。
如果使用属性保存PositionController
引用,则它的生存期将与视图控制器对象相同:
class MapViewController: UIViewController, CLLocationManagerDelegate {
let positionController = PositionController()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// For use in foreground
print("-----------------------In------------------------")
self.positionController.getPosition()
print("-----------------------Out------------------------")
let camera = GMSCameraPosition.camera(withLatitude: 48.137154
longitude: 11.576124, zoom:12)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera:camera)
let marker = GMSMarker()
marker.position = camera.target
marker.snippet = "Munich"
marker.appearAnimation = GMSMarkerAnimation.pop
marker.map = mapView
self.view = mapView
}
您可能希望在应用程序中有一个
PositionController
的实例。您可以将其设置为AppDelegate
的属性,也可以将其设置为单独的属性(单独的属性可能会产生可模仿性和测试问题,因此我将由您决定如何执行)。