我有一个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()
}
}
但是,每当我对应用程序进行后台处理(单击主页),然后返回应用程序时,该位置都不会更新。知道我在这里做错了什么吗?
答案 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
中,您可以在(例如)viewWillAppear
和viewWillDisappear
中注册和取消注册通知。注册时,您可以指出要为事件调用的方法,并在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()
}