我有一个视图控制器,它具有以下功能:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
print("loc")
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError){
if(error.code == CLError.Denied.rawValue){
print("error")
}
}
它是此类的直接子级:
import UIKit
import CoreLocation
class UIViewLocationManager : UIViewController, CLLocationManagerDelegate{
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
print(status.rawValue)
switch status {
case .NotDetermined:
break
case .AuthorizedWhenInUse:
if #available(iOS 9.0, *) {
manager.requestLocation()
} else {
manager.startUpdatingLocation()
}
break
case .AuthorizedAlways:
break
case .Denied:
break
default:
break
}
}
}
然后我上了这门课
class CoreLocationController : NSObject {
func requestLocationUpdate(delegate : CLLocationManagerDelegate){
let locationManager = CLLocationManager()
locationManager.delegate = delegate
if #available(iOS 8.0, *) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}
然后在AppDelegate中声明如下:
let coreLocationController = CoreLocationController()
但是当我从viewController调用requestLocationUpdate(self)
时,它是UIViewLocationManager
的子级,我没有收到任何更新。然而,如果我只是复制粘贴所有的方法到CoreLocationController
,并在CoreLocationController init()
方法中执行locationManager.delegate = self
,那么一切都工作正常。
有什么想法吗?我真的很绝望,因为我已经尝试了这么多aproaches,但仍然不能得到这个工作。
先谢谢你
1条答案
按热度按时间vu8f3i0k1#
locationManager
是requestLocationUpdate
方法中的一个局部变量。在requestLocationUpdate
调用结束时,locationManager
将被销毁,并且刚刚创建的CLLocationManager
将没有任何内容引用它,因此它也将被销毁,尽管您已经要求它向现有的delegate
发送消息。如果您创建的
CoreLocationController
的示例没有被销毁(某些内容始终指向该示例),则将locationManager
更改为示例变量应该可以解决此问题:上面的代码在真实的的iPhone 5和模拟的iPhone 6上都能正常工作。