5

我有MKMap一个系列MKAnnotations,所有这些都是红色的,这很好。我在 IB 中选择了“显示用户位置”并将其MKAnnotation从红色更改为蓝色,我的viewForAnnotation方法中有代码:

if (annotation == theMap.userLocation)
    return nil;

一切都很好,应用程序运行良好,但如果用户无意中点击了蓝色的用户位置点,我会收到以下崩溃:

2012-02-01 20:43:47.527 AusReefNSW[27178:11603] -[MKUserLocationView setPinColor:]: unrecognized selector sent to instance 0x79b0720
2012-02-01 20:43:47.528 AusReefNSW[27178:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKUserLocationView setPinColor:]: unrecognized selector sent to instance 0x79b0720'
*** First throw call stack:

如果我删除上面的代码,一切正常,但引脚是红色的。我更喜欢有蓝色图标,但尚未发现崩溃的原因。任何想法,将不胜感激。谢谢。

解决了!感谢 Marvin 和这里的代码,以防有人发现它有用。简而言之,我必须首先检查 MKAnnotation 是属于 MyAnnotation 类还是属于 MKUserLocation 类。

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKPinAnnotationView *)view
{
 theAnnotationSelected = [[mapView selectedAnnotations] objectAtIndex:0];
if ([theAnnotationSelected isKindOfClass:[MyAnnotation class]] ) 
{
view.pinColor = MKPinAnnotationColorGreen;

}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
if ([theAnnotationSelected isKindOfClass:[MyAnnotation class]] ) 
{
view.pinColor = MKPinAnnotationColorRed;
}
4

4 回答 4

24

对于当前用户位置,转到MKMapView属性并在 XIB 中显示用户位置进行选择。

然后在您的控制器中实现 MKMapViewDelegate..并在您的控制器中编写此方法

-(MKAnnotationView *)mapView:(MKMapView *)pmapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;  //return nil to use default blue dot view

    if([annotation isKindOfClass:[MKAnnotationClass class]])
    {
        //Your code
    }
}

还有这个

- (void)mapView:(MKMapView *)mapView1 didSelectAnnotationView:(MKAnnotationView *)customAnnotationView
{

    if(![annotation isKindOfClass:[MKUserLocation class]])
    {
          //Your code
    }

}

使用它,您可以在用户位置上看到蓝点..

于 2012-02-01T09:55:39.050 回答
9

您将要检查注释的类别

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{

然后执行以下操作..

id *annotation = view.annotation;
    if (![annotation isKindOfClass:[MKUserLocation class]]) {
//Normal Code here
}
于 2012-02-01T09:49:29.077 回答
1

此解决方案适用于 iOS7 以抑制标注视图,但不会阻止用户选择蓝点。 如何在地图视图中抑制“当前位置”标注

我还没有找到一种方法来禁用当前位置点的选择。

这与其说是一种解决方法,不如说是一种“处理它的方法”,但我放大地图以在点击时专注于某些类型的注释。如果用户恰好位于一个人的正上方,则缩放有助于在蓝点和我的注释之间留出一些距离,从而更容易点击。

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

if([view.annotation isKindOfClass:[SpecialClass class]]){

    SpecialClass *cluster = (SpecialClass *)view.annotation;
    if(testCriteria){
        [self.mapView setRegion:MKCoordinateRegionMakeWithDistance(cluster.coordinate, cluster.radius, cluster.radius) animated:YES];
    }
}
于 2014-02-01T18:30:44.687 回答
1

我遇到了同样的问题,当用户点击 MKUserlocation“蓝点”时,应用程序会崩溃。我正在使用 Ching-Lan 'digdog' HUANG 的 DDAnnotation。我发现的修复是

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
id annotation = view.annotation;
    if (![annotation isKindOfClass:[MKUserLocation class]]) {
//Your Annotation Code here
}
}
于 2015-10-07T20:58:09.823 回答