正确的标注附件方法和实现

时间:2011-10-28 00:27:38

标签: ios xcode map annotations mapkit

我想知道是否有人可以告诉我如何在地图注释中添加正确的标注附件。我尝试的一切似乎都没有到达任何地方,所以任何帮助将不胜感激。

修改

我已尝试过这行代码,但注释没有任何不同。

- (MKAnnotationView *)mapview:(MKMapView *)sender viewForAnnotation:(id <MKAnnotation>)annotation 
{
MKAnnotationView *aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@""];
aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
aView.canShowCallout = YES;
aView.annotation = annotation;
return aView;
}

1 个答案:

答案 0 :(得分:34)

方法名称错误。它应该是mapView,大写为V

- (MKAnnotationView *)mapView:(MKMapView *)sender 
            viewForAnnotation:(id <MKAnnotation>)annotation 

Objective-C区分大小写。

如果仍未调用该方法,则另一个问题是未设置地图视图的delegate。在代码中,将其设置为self或在Interface Builder中将委托附加到文件所有者。

另外,请确保在添加注释之前设置注释的title,否则标注仍然不会显示。

以上更改应修复未出现的配件按钮。


其他一些不相关的建议......

viewForAnnotation中,您应该通过调用dequeueReusableAnnotationViewWithIdentifier来支持重复使用注释视图:

- (MKAnnotationView *)mapView:(MKMapView *)sender viewForAnnotation:(id < MKAnnotation >)annotation
{
    static NSString *reuseId = @"StandardPin";

    MKPinAnnotationView *aView = (MKPinAnnotationView *)[sender 
                dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (aView == nil)
    {
        aView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                    reuseIdentifier:reuseId] autorelease];
        aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        aView.canShowCallout = YES;
    }

    aView.annotation = annotation;

    return aView;   
}

如果您的项目使用ARC,请删除autorelease


顺便说一下,要响应附件按钮按下,请实施calloutAccessoryControlTapped委托方法:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
        calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"accessory button tapped for annotation %@", view.annotation);
}