【问题标题】:Stop Updating location from different View Controller停止从不同的视图控制器更新位置
【发布时间】:2018-03-01 11:22:05
【问题描述】:

我已经实现了一个开始更新用户位置然后呈现不同视图的代码。

self.manager.startUpdatingLocation(interval: 4) self.present(viewController, animated: true , completion: nil)

然后当我尝试停止更新位置时,我的应用仍在打印坐标。

是否有任何代码可以从整个应用中禁用位置管理器?然后,如果我想重新开始,我想使用同一行代码

我尝试过的事情:

 func stopLocation (){
    DispatchQueue.main.async {
        self.locationManager.stopUpdatingLocation()
        self.manager.stopUpdatingLocation()

    }
}

self.manager.stopUpdatingLocation()

【问题讨论】:

  • 确保您没有创建多个管理器实例。
  • 我确实在第二个视图中创建了实例。如果我不这样做,它将显示错误found nil
  • 为启动和停止的功能创建一个类.. 只需在 viewdidload 或 viewdidappear 中调用您需要的任何视图控制器,并确保在 viewdiddisappear 中停止它

标签: swift xcode location locationmanager


【解决方案1】:

您的问题是您正在为每个视图控制器创建不同的经理/位置经理副本。您需要两个视图控制器都与之通信的单个对象来控制您的应用对位置管理器的使用。

这是单例设计模式的一个很好的用例。将您的 Manager 类设为单例,然后使用该单一实例来管理您的位置管理器状态。

调用可能如下所示:

Manager.shared.stopUpdatingLocation()

你应该可以谷歌“Swift单例模式”来了解它。网上有几十个代码示例。

【讨论】:

  • 它已经是一个在后台模式下更新位置的库。 github.com/paleksandrs/APScheduledLocationManager 是否可以由此制作单例?
  • 可能,虽然看了一眼,但它被设置为通知单个代表有关位置更新的信息。您可能希望它通知当前的前视图控制器,因此您可能需要更改委托。可能需要进行一些重构才能做到这一点。
  • 谢谢。我正在为委托以及如何设置它而苦苦挣扎。如果你能帮我解决一下
  • 这将取决于APScheduledLocationManager 框架的编写方式,我没有时间深入研究。
  • 看起来APScheduledLocationManager 被编写为在它的初始化程序中接受一个委托,并且不允许您更改它。您将需要重构该类以使其能够更改委托,或者创建一个中间对象作为APScheduledLocationManager 的委托并将位置更新转发到您的视图控制器。或者,您可以重构 APScheduledLocationManager 类以广播有关位置更新的通知管理器通知。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多