gpt4 book ai didi

swift - CLLocationManagerDelegate 未接收更新

转载 作者:行者123 更新时间:2023-11-30 10:07:27 24 4
gpt4 key购买 nike

我有一个 View Controller ,它具有以下功能:

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()

但是当我从 UIViewLocationManager 的子 viewController 调用 requestLocationUpdate(self) 时,我没有收到任何更新。但是,如果我只是将所有方法复制粘贴到 CoreLocationController 并在 CoreLocationController init() 方法中执行 locationManager.delegate = self ,则一切正常.

有什么想法吗?我真的很绝望,因为我已经尝试了很多方法,但仍然无法正常工作。

提前致谢

最佳答案

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 中都适用。位置更新委托(delegate)代码被调用。我确实必须按照 CLLocation Manager in Swift to get Location of User 中指定的方式编辑 plist

关于swift - CLLocationManagerDelegate 未接收更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35243177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com