ViewForAnnotation未被调用

时间:2010-09-29 12:22:00

标签: objective-c

我正在制作一张地图,在那里我可以看到我当前的位置,看看街道的名字。

到目前为止,我可以在我的地图上放置一个图钉,但出于某种原因,我没有收到标注。 我已经在我的viewForAnnotation方法中放了一个NSLog,但它没有被调用,所以我无法测试它。

有人可以帮助我吗?

-(void)lat:(float)lat lon:(float)lon
{
    CLLocationCoordinate2D location;
    location.latitude = lat;
    location.longitude = lon;
    NSLog(@"Latitude: %f, Longitude: %f",location.latitude, location.longitude);
    //One location is obtained.. just zoom to that location

    MKCoordinateRegion region;
    region.center=location;
    //Set Zoom level using Span
    MKCoordinateSpan span;
    span.latitudeDelta=.005f;
    span.longitudeDelta=.005f;
    region.span=span;
    [map setRegion:region animated:TRUE];

    //MKReverseGeocoder *geocoder=[[MKReverseGeocoder alloc] initWithCoordinate:location];
    //geocoder.delegate=self;
    //[geocoder start];
    if (cPlacemark != nil) {
        [map removeAnnotation:cPlacemark];
    }
    cPlacemark=[[CustomPlacemark alloc] initWithCoordinate:location];
    cPlacemark.title = mPlacemark.thoroughfare;
    cPlacemark.subtitle = mPlacemark.locality;
    [map addAnnotation:cPlacemark];
    [cPlacemark release];

    [mLocationManager stopUpdatingLocation];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

// try to dequeue an existing pin view first
if ([annotation isKindOfClass:[CustomPlacemark class]]){
MKPinAnnotationView *pinView=(MKPinAnnotationView *)[map dequeueReusableAnnotationViewWithIdentifier:@"customIdentifier"];

if (!pinView)
{
    // if an existing pin view was not available, create one
    MKPinAnnotationView* cPinAnnoView = [[[MKPinAnnotationView alloc]
                                           initWithAnnotation:annotation reuseIdentifier:@"customIdentifier"] autorelease];
    cPinAnnoView.pinColor = MKPinAnnotationColorPurple;
    cPinAnnoView.animatesDrop = YES;
    cPinAnnoView.canShowCallout = YES;
    // Add button
    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [leftButton addTarget:self action:@selector(annotationViewClick:) forControlEvents:UIControlEventTouchUpInside];
    cPinAnnoView.leftCalloutAccessoryView = leftButton;

} else
    {
        pinView.annotation = annotation;
    }
    return pinView; 
}
return nil;

}

现在我已经将我的viewForAnnotation定制为这样。 但我仍然无法从我的引脚获得标注,并且引脚仍为红色。 但它应该是紫色的

9 个答案:

答案 0 :(得分:32)

我遇到了同样的问题,即没有将MapView委托设置为文件所有者。

  1. 打开你的笔尖
  2. 右键单击MapView
  3. 将代理拖到文件所有者

答案 1 :(得分:23)

正如你所提到的,我遇到了同样的问题。委托已设置为ViewController,但未调用viewForAnnotation选择器。经过一些检查后,我意识到如果你没有在主线程中调用addAnotation,mapView就不会调用viewForAnnotation,所以在更新后解决了我的问题:

在:

[_mMapView addAnnotation:marker];

后:

dispatch_async(dispatch_get_main_queue(), ^{
     [_mMapView addAnnotation:marker];
});

答案 2 :(得分:7)

要启动viewForAnnotation,请将mapView.delegate=self;添加到例如viewDidLoad- (void)viewDidLoad { [super viewDidLoad]; mapView.delegate=self; } 方法:

{{1}}

答案 3 :(得分:5)

您的注释是否已添加到MKMapView的当前视图区域之外?

答案 4 :(得分:2)

对于storyboard,Ctl将MKMapView拖动到ViewController底栏上的橙色圆圈,然后选择委托。

这将解决问题。

答案 5 :(得分:1)

其他人已经解释过,你没有将mapview委托与控制器连接的可能性很高。它首先要检查

答案 6 :(得分:1)

作为评论中提到的vatrif,您必须设置代理之前为MKMapView对象添加注释。

答案 7 :(得分:0)

我一直在使用ios 9 Mapview相关的应用程序,我遇到了同样的问题。

不知怎的,我解决了我的问题,在我的情况下我正在调整mapview的大小。 我在调整delegate的大小后添加了mapview。它现在完美无缺。!

答案 8 :(得分:0)

在设置了mapview的委托之后,如果仍未调用viewforannotation,那么这就是你错过了 - 将self.mapView.showsUserLocation设置为YES,在界面构建器中你可以勾选属性检查器中的show userLocation选项