如何静态获取用户位置并在其他 iOS 类中使用?

Posted

技术标签:

【中文标题】如何静态获取用户位置并在其他 iOS 类中使用?【英文标题】:How to get users location statically and use it in other classes iOS? 【发布时间】:2016-11-17 18:01:32 【问题描述】:

我想将用户的位置方法与 LocationUtils 分开,这样我就可以使用它们并且不必继续编写重复的方法,但我正在努力做到这一点,有没有我可以学习的资源?我是 ios 新手。

class LocationUtils: NSObject, CLLocationManagerDelegate 
  let locationManager = CLLocationManager()
  var userCity: String?

  func enableLocationServices() 
    self.locationManager.requestAlwaysAuthorization()

    if CLLocationManager.locationServicesEnabled() 
      locationManager.delegate = self // Comment
      locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
      locationManager.startUpdatingLocation()
    
    self.locationManager.requestLocation()
  


  // Try ro call this statically
  func getUsersClosestCity(lat: CLLocationDegrees, lng: CLLocationDegrees)
    let geoCoder = CLGeocoder()
    let location = CLLocation(latitude: lat, longitude: lng)
    geoCoder.reverseGeocodeLocation(location) 
      (placemarks, error) -> Void in

      let placeArray = placemarks as [CLPlacemark]!
      var placeMark: CLPlacemark!
      // Can the array throw an exception
      placeMark = placeArray?[0]
      if (placeMark != nil) 
       //userCity = placeMark.addressDictionary?["City"] as? String?
        self.userCity = placeMark.addressDictionary?["City"] as? String

      

    

  
  func getUserCity() -> String? 
    return self.userCity
  

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    self.getUsersClosestCity(lat: locValue.latitude, lng: locValue.longitude)
  


现在我想在项目的各个类中使用这些方法

我就是这么用的

override func loadView() 
    super.loadView()
    setLocationView()

  





 func setLocationView() 
    let locationLabel : UILabel = UILabel(frame: CGRect(x: UIScreen.main.bounds.width/3, y: UIScreen.main.bounds.height, width: 500, height: 21))
    let locationLabelFrame = CGRect(x : UIScreen.main.bounds.width/4, y: 3 * (UIScreen.main.bounds.width/4), width : 125, height : 45)
    locationLabel.frame = locationLabelFrame
    locationLabel.backgroundColor = UIColor.blue
    let locUtil = LocationUtils()
    locUtil.enableLocationServices()
    if (locUtil.getUserCity() != nil) 
      locationLabel.text = locUtil.getUserCity()
    

    self.view.addSubview(locationLabel)
  

这不会将 UILabel 添加到视图中,当我删除与位置相关的调用时,我会在视图上得到一个标签

如果有人能指导我学习我可以学习的资源或任何关于如何做的提示,我将不胜感激

谢谢

【问题讨论】:

【参考方案1】:

您可以创建一个可供所有视图控制器使用的单例位置服务:

class LocationReportingService 
    static let shared = LocationReportingService()
    fileprivate let locationManager = CLLocationManager()
    private override init() 
        super.init()
    
    func beginMonitoring() 
        //insert logic here
    

要使用它,您调用 LocationReportingService.shared.beginMonitoring()。您可以添加 las know location 的属性,还可以使用 NotificationCenter.default.post 广播事件,您的其他视图控制器可以侦听。

【讨论】:

以上是关于如何静态获取用户位置并在其他 iOS 类中使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios 8 中获取键盘位置并在 numberPad 上添加 DONE 按钮

iOS - CLLocation Manager didUpdateLocations 在一个类中被调用,而不是在另一个类中?

我如何在 ios 的 Facebook 集成中获取用户的位置、家乡和电子邮件 ID

如何获取当前位置IOS设备

如何检测用户当前位置授权并在ios中重新加载数据?

如何在 UIPickerView 中获取用户选择并在其他地方使用它?