Iphone 是否使用MKMapView显示当前用户位置?

Iphone 是否使用MKMapView显示当前用户位置?,iphone,ios,mapkit,Iphone,Ios,Mapkit,我试图通过设置MKMapView的属性来显示用户的当前位置,即setShowsUserLocation设置为YES。默认情况下,当应用程序开始更新用户位置时,iPhone屏幕左上角会出现一个箭头。但在显示当前位置后,箭头应该会消失,但只要应用程序正在运行,箭头就仍然存在,这意味着应用程序仍在后台更新位置?那么,如何停止更新当前位置?我已经实现了立即调用的委托。您可以通过向位置经理发送消息来停止更新位置[self.locationManager stopdationlocation] 对于您的情况

我试图通过设置
MKMapView
的属性来显示用户的当前位置,即
setShowsUserLocation
设置为
YES
。默认情况下,当应用程序开始更新用户位置时,iPhone屏幕左上角会出现一个箭头。但在显示当前位置后,箭头应该会消失,但只要应用程序正在运行,箭头就仍然存在,这意味着应用程序仍在后台更新位置?那么,如何停止更新当前位置?我已经实现了立即调用的委托。

您可以通过向位置经理发送消息来停止更新位置
[self.locationManager stopdationlocation]


对于您的情况,您是否尝试停止显示用户位置?

如果地图可见并且已将showUserLocation设置为“是”,则它将在后台继续更新

当视图消失或应用程序转到后台时,您需要取消设置此选项。最好的方法可能是注册viewController,以便收到
UIApplicationIdentinterBackgroundNotification
UIApplicationIDBecMeactiveNotification
的通知

- (void)viewDidLoad{
  [super viewDidLoad];
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appToBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appReturnsActive) name:UIApplicationDidBecomeActiveNotification object:nil];
} 
然后在此通知调用的方法中,更改有关
userLocation
的地图视图属性:

- (void)appToBackground{
  [mapview setShowsUserLocation:NO];
}


通过在此处设置断点并返回主屏幕,检查是否确实调用了这些方法。

我同意Michael Kennahan的观点,我非常确定
MKMapView
中存在竞争条件

MKMapView
一旦意识到无法访问定位服务,就会试图自行删除
userLocationAnnotation
(蓝点)


但是,这似乎不受保护,如果开发人员还发出
[mapView setShowsUserLocation:NO]
,很可能会因为
MKMapView
的内部线程试图删除
userLocationAnnotation
之间的争用而崩溃,而调用
setShowsUserLocation:NO

的线程我没有使用任何位置管理器。。如果我停止它,它将隐藏注释(位置)以尝试实现
CLLocationManagerDelegate
,您将有更好的方法控制CoreLocation框架。你可以在这里找到一个很好的入门教程:我一直在使用这个方法,但是当进入后台时,我得到了一个看起来像是种族条件崩溃的结果:
[MKMapView(UserPositioning)stopUpdatengUserLocation]
调用
[MKMapView(UserPositioningInternal)removeUserLocation]
,它用SIGSEGV爆炸。你不认为你已经看到/解决了这个问题吗?需要在
viewDidUnload
时删除observer吗?@MichaelKernahan我也遇到了同样的问题。您找到解决方案了吗?@horsejockey-在删除用户位置之前,请尝试将
mapView
委托设置为
nil
。同意。这在iOS 7.x中似乎确实是一个问题。我想我还没在8.x上看过。
- (void)appReturnsActive{
  [mapview setShowsUserLocation:YES];
}