requestLocationisn调用didUpdateLocations

时间:2017-06-04 22:10:51

标签: ios swift xcode

首先:我知道这里有类似的线索,但没有任何建议对我有用。

这是我想要做的: 我希望有一个PositionController(Class)来控制用户的当前位置,并为其他类,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-Method。但是当我调用该函数时,它只是通过代码块而不会在最后调用两个代理函数。

我还有"隐私 - 使用时的位置说明"和 "位置使用说明"添加到我的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

}

1 个答案:

答案 0 :(得分:0)

您的问题是您在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的一个属性,或者让它成为一个单独的属性(单身人士可以创建可模拟性和测试的问题,所以我会让你决定你想做什么)。