Swift:从后台返回时未更新位置

时间:2015-02-23 05:33:18

标签: swift core-location

我有一个Swift应用程序,我试图在从后台返回应用程序时更新位置,但从后台返回时它似乎不起作用。

在推出应用程序时,我会得到这个位置。获取位置后,我调用stopUpdatingLocation(),所以我不继续获取位置:     locationManager.stopUpdatingLocation()

然后,在我的AppDelegate.swift中再次启动UbuatingLocation:

func applicationWillEnterForeground(application: UIApplication) {

    ViewController().locationManager.startUpdatingLocation()
}

到目前为止,这是我的代码:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

var locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
}

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

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    println("Error while updating location " + error.localizedDescription)
}

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

    var userLocation:CLLocation = locations[0] as CLLocation

    println("\(userLocation.coordinate.latitude),\(userLocation.coordinate.longitude)")

    locationManager.stopUpdatingLocation()

}

}

但是,每当我对应用程序进行后台处理(单击主页),然后返回应用程序时,该位置都不会更新。知道我在这里做错了什么吗?

1 个答案:

答案 0 :(得分:2)

applicationWillEnterForeground中,代码正在创建一个永远不会显示的ViewController的新本地实例,但尚未创建locationManager,因此无效。

它不是指已经存在并显示的ViewController实例(并且具有最初启动的locationManager实例)。

相反,它应该获得对现有实例的引用。假设ViewController是根视图控制器,您可以这样做:

func applicationWillEnterForeground(application: UIApplication) {

    if let rvc = window?.rootViewController as? ViewController {
        rvc.locationManager.startUpdatingLocation()
    }

}

<小时/> 但是,让ViewController类本身管理自己的行为可能是更好的做法。这样,app委托不必查找对视图控制器实例的引用,也不会直接访问视图控制器的内部状态,ViewController变得更加独立。

除了app委托方法applicationWillEnterForeground之外,还可以使用UIApplicationWillEnterForegroundNotification通知从任何地方监控这些事件。

ViewController中,您可以在(例如)viewWillAppearviewWillDisappear中注册和取消注册通知。注册时,您可以指出要为事件调用的方法,并在ViewController内处理所有内容(并且applicationWillEnterForeground中的代码可以删除)。

override func viewWillAppear(animated: Bool) {
    NSNotificationCenter.defaultCenter().addObserver(
        self, 
        selector: "willEnterForegound", 
        name: UIApplicationWillEnterForegroundNotification, 
        object: nil)
}

override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(
        self, 
        name: UIApplicationWillEnterForegroundNotification, 
        object: nil)
}

func willEnterForegound() {
    locationManager.startUpdatingLocation()
}