【问题标题】:Add CLLocationManagerDelegate to a separate class将 CLLocationManagerDelegate 添加到单独的类
【发布时间】:2020-02-16 19:17:47
【问题描述】:

我想从我的 ViewController 中删除 CLLocationManagerDelegate 并添加到一个单独的类中并使其可重用。我对 swift 很陌生,所以我请求您的帮助,也许您可​​以为我指明正确的方向。

我的目标是每次我想要用户的位置时调用我的 LocationHandler 类,并且大多数时候我想以不同的方式处理位置(例如,只需按原样保存或其他时间检查位置以及是否满足某些规则然后保存它等...)

如果可以处理位置更改,我想将一个函数传递给我的 LocationHandler 类。

类似这样的:(这只是一个伪代码,我不知道如何在swift中正确执行)

让 locationHandler = LocationHandler()

locationHandler.handleLocationChange = (locations: [CLLocation]) - > {...}

locationHandler.getCurrentLocation()

我的第一个问题是,当我从 LocationHandler 创建一个实例时,getCurrentLocation 函数运行正常,但 didUpdateLocations 从未上升(我认为委托有问题)

其次我不知道如何将函数作为参数传递给类

这是我的 LocationHandler 类

import Foundation
import CoreLocation

class LocationHandler: NSObject, CLLocationManagerDelegate{
    
    let locationManager = CLLocationManager()
   
    
    override init(){
        super.init()
        
        locationManager.delegate = self
        
    }
    
    func getCurrentLocation(){
     
        if CLLocationManager.locationServicesEnabled() {
            switch CLLocationManager.authorizationStatus() {
                case .notDetermined, .restricted, .denied:
                    print("No access")
                case .authorizedAlways, .authorizedWhenInUse:
                    print("Access")
                @unknown default:
                break
            }
            } else {
                print("Location services are not enabled")
        }
        
        
        locationManager.requestWhenInUseAuthorization()
        locationManager.requestLocation()
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
          if let location = locations.first {
              print("Found user's location: \(location)")
              //do something with the location
          }
      }
      
      func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
          print("Failed to find user's location: \(error.localizedDescription)")
      }
    
    
    
}

我像这样在视图控制器中使用它:

  let locationHandler = LocationHandler()
  locationHandler.getCurrentLocation()

【问题讨论】:

  • 您的 LocationHandler 实例是您的视图控制器的属性吗?您显然希望确保它不会超出范围并被释放。我也没有看到你从哪里开始定位服务。您可能不想只请求位置,而是打开位置服务,以便它有机会预热并获得越来越准确的位置。
  • @Rob,是的,问题是我在函数级别创建了实例,当我移动到 vc 级别时它开始正常工作。

标签: ios swift locationmanager


【解决方案1】:

正如所写,您必须确保LocationHandler 实例是视图控制器的属性,而不是局部变量。您希望确保它不会超出范围并在委托方法有机会被调用之前被释放。

【讨论】:

  • 另外,打开位置服务是什么意思,在我的示例中,我想要用户的位置一次,你是否建议即使我想要它一次我应该不断运行服务?
  • 如果您在物理设备上调用startUpdatingLocation,您会看到一系列位置更新开始出现,这些更新越来越准确(即horizontalAccuracy 越来越小)。通常,您收到的第一个 CLLocation 不会那么准确。确保在物理设备而不是模拟器上进行测试,以便在实践中了解模式。
  • 当用户按下“这就是我在哪里”按钮时,我怎样才能从该系列中取出一个?
  • 以物理 iPhone 上的内置地图应用程序为例。通常当你第一次启动它时(假设你没有做其他事情来获得准确的位置),它会在一个大半径的地图上显示你以反映horizontalAccuracy 值,并且它通常会慢慢变得越来越多准确的。如果您想在应用中获得准确的位置,则需要让 GPS 有机会“预热”并提供越来越准确的位置信息。
  • 如果你只是想弄清楚某人的大致位置(例如“最近的手机信号塔”的准确度),第一个值就足够了。另一种技术是在用户有机会点击“我在哪里”按钮之前启动定位服务,所以当他们到达那里时,你就有机会获得准确的位置。或者,像 Uber/Lyft 应用程序一样,向用户显示 MKMapViewshowsUserLocation,以便用户可以看到它慢慢锁定到他们的位置,并让他们选择手动调整位置。有很多方法可以解决这个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2021-10-03
  • 2015-03-10
相关资源
最近更新 更多