【问题标题】:Mapbox iOS SDK setShowsUserLocation:FALSE causes crashMapbox iOS SDK setShowsUserLocation:FALSE 导致崩溃
【发布时间】:2014-05-07 00:45:33
【问题描述】:

我有一个带有特定平铺区域的应用。如果用户不在此区域并尝试在地图上显示他们的位置,我希望应用程序拒绝请求并显示警报。我认为最好的过程是:

  1. 用户点击将userTrackingMode 设置为RMUserTrackingModeFollow 并将showsuserLocation 设置为TRUE 的按钮。
  2. 在地图委托中,我回复 mapView:didUpdateUserLocation: 并检查以确保用户的位置在 mapView 的 tilesource 边界框内。
  3. 如果用户的位置在边界框之外,我将userTrackingMode设置为RMUserTrackingModeNone并将showsuserLocation设置为FALSE。

当我将 userTrackingMode 设置为 RMUserTrackingModeNone 时,没有任何不好的事情发生。但是当我将 showsuserLocation 设置为 FALSE 时,我总是会遇到类似于以下内容的崩溃:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSSetM addObject:]: object cannot be nil' *** First throw call stack: ( 0 CoreFoundation 0x028291e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x025a88e5 objc_exception_throw + 44 2 CoreFoundation 0x028c8a7e -[__NSSetM addObject:] + 638 3 IMAModularMapApp 0x00243b02 -[RMMapView addAnnotation:] + 146 4 IMAModularMapApp 0x00247bdb -[RMMapView locationManager:didUpdateToLocation:fromLocation:] + 7115 5 CoreLocation 0x00c7355e CLLocationCoordinate2DGetDistanceFrom + 18294 6 CoreLocation 0x00c72af4 CLLocationCoordinate2DGetDistanceFrom + 15628 7 CoreLocation 0x00c6fe40 CLLocationCoordinate2DGetDistanceFrom + 4184 ...etc

为什么这会使应用程序崩溃?还有其他地方我应该检查用户的位置是否在地图内?

【问题讨论】:

  • 最好的发现方法是设置异常断点。转到左侧的断点选项卡,左下角是加号。您会在那里看到菜单项。
  • 是的,我知道崩溃发生的方式和位置(在 SDK 代码中)。我的问题是关于 SDK 以及我应该在哪里/如何测试用户的位置是否在 tilesource 的边界框内的更具体的问题,因为它正在崩溃。
  • 把showuserLocation的SDK头声明贴出来怎么样?如果您将其设置为 FALSE(其中 == NO == 0),并且它需要一个对象(如 @0),那么如果 SDK 将该标量值放入 NSMutableSet,您就会看到确切的崩溃。
  • @Danh showsuserLocation 是一个 BOOLean 属性,它的 set 方法被覆盖,以包含一个在应用程序中发起启动用户跟踪的过程。同样,这是一个尝试找出我需要通过什么过程来防止基于使用 SDK 的区域进行用户跟踪的问题——而不是专门检查 SDK 中的错误。
  • 我认为我可以帮助您的最好方法是建议对问题进行重写:标题应该类似于:“如何在 Mabbox 中从跟踪中排除区域”。正文应该是这样的:“这是我为此编写的代码,但它不起作用。事实上,它在我的源代码中的这一行上崩溃了。放将 ios 标记放回原处,并将崩溃日志替换为“崩溃日志显示 nil 插入集合”的一行。

标签: mapbox


【解决方案1】:

如果您不打算使用地图的默认行为始终移动以实际跟踪用户,我不建议更改 mapView.userTrackingMode。相反,我将其保留为RMUserTrackingModeNone,实现您自己的CLLocationManager,并在用户位置的委托回调中检查它们是否符合您的条件。如果他们这样做,我会将您自己的 RMAnnotation 添加到用户的地图中,而不是依赖默认的 RMUserLocation 注释。您可以从它的实现中借用(在该类中以及在RMMapView 中)以使其看起来正确。

【讨论】:

  • 好的,所以没有内置功能可以“批准”用户的位置对地图有效吗?我猜这排除了用户对任何非全局图块集的跟踪,而无需创建自定义 GPS 气泡。否则它只会移动到空白处。
  • 不,没有,但是当你这样说时,它听起来像是一个非常有用的功能。我可以看到在RMMapViewDelegate 中添加了一个回调来支持这种功能。想要打开工单和/或拉取请求?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2021-05-08
  • 2012-04-24
  • 2013-04-01
  • 2015-11-19
相关资源
最近更新 更多