swift2 CLLocationManagerDelegate未接收到更新

eyh26e7m  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(206)

我有一个视图控制器,它具有以下功能:

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,但仍然不能得到这个工作。
先谢谢你

vu8f3i0k

vu8f3i0k1#

locationManagerrequestLocationUpdate方法中的一个局部变量。在requestLocationUpdate调用结束时,locationManager将被销毁,并且刚刚创建的CLLocationManager将没有任何内容引用它,因此它也将被销毁,尽管您已经要求它向现有的delegate发送消息。
如果您创建的CoreLocationController的示例没有被销毁(某些内容始终指向该示例),则将locationManager更改为示例变量应该可以解决此问题:

class CoreLocationController : NSObject {
    var locationManager:CLLocationManager?
    func requestLocationUpdate(delegate : CLLocationManagerDelegate) {
        locationManager = CLLocationManager()
        locationManager?.delegate = delegate
        locationManager?.requestWhenInUseAuthorization()
    }
}

上面的代码在真实的的iPhone 5和模拟的iPhone 6上都能正常工作。

相关问题