在自定义注记类中执行对象创建时,不显示MKAnnotationView

时间:2013-12-10 14:16:37

标签: ios mkannotationview

环境

Xcode:5.0.2,设备:iPhone, iOS:iOS 7

我正在尝试使用mapView:viewForAnnotation:委托方法。在此方法中,如果我创建MKAnnotationView对象,则会显示引脚而不会出现任何问题。这是工作代码:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[CustomeAnnotation class]])
    {
        //  CustomeAnnotation *myLocation = (CustomeAnnotation *)annotation;
        MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"MyCustomAnnotation"];

        if (annotationView == nil)
        {
            MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"MyCustomAnnotation"];
            annotationView.enabled = YES;
            annotationView.canShowCallout = YES;
            //annotationView.image = [UIImage imageNamed:@"park_icon"];
            annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        }
        //   annotationView = myLocation.createAnnotationView;
        else
            annotationView.annotation = annotation;

          //return nil;
        return annotationView;

    }
    else
        return nil;
}

当我创建一个类方法并在类方法中移动MKAnnotationView对象创建和属性设置并且我从mapView:viewForAnnotation:委托方法调用它时,该引脚不会出现。

以下是相关两种方法的代码(mapView:viewForAnnotation:createAnnotationView):

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.mapView.delegate = self;

    CLLocationCoordinate2D baysideParkCoordinates = CLLocationCoordinate2DMake(25.774407, -80.185797);
    CustomeAnnotation *baysideParkAnnotation = [[CustomeAnnotation alloc] initWithTitle:@" Bayfront Park"
                                                                             coordinate:baysideParkCoordinates];
    [self.mapView addAnnotation:baysideParkAnnotation];

}

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[CustomeAnnotation class]])
    {
        CustomeAnnotation *myLocation = (CustomeAnnotation *)annotation;
        MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"MyCustomAnnotation"];

        if (annotationView == nil)
                annotationView = [myLocation createAnnotationView];
        else
            annotationView.annotation = annotation;

      //  return nil;
        return annotationView;

    }
    else
        return nil;
}

@end

自定义类

#import "CustomeAnnotation.h"

@implementation CustomeAnnotation

-(id)initWithTitle:(NSString *)newTitle coordinate:(CLLocationCoordinate2D) newCoordinate
{
    self = [super init];
    if (self)
    {
        self.title = newTitle;
        self.coordinate = newCoordinate;
    }
    return self;
}


-(MKAnnotationView *)createAnnotationView
{
    MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:self reuseIdentifier:@"MyCustomAnnotation"];
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    //annotationView.image = [UIImage imageNamed:@"park_icon"];
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return annotationView;
}
@end

CustomeAnnotation类的import语句包含在ViewController.h文件中。

此时我相信我没有正确地将MKAnnotationView对象传回ViewController实现文件中的方法调用。谁能告诉我在第二组代码上我做错了什么?

1 个答案:

答案 0 :(得分:0)

第二个代码集中,在createAnnotationView中,注释未显示,因为它未设置image

请注意,MKAnnotationView没有默认图像,因此如果不设置,则注释不可见。

取消注释image的设置(或改为创建MKPinAnnotationView)。


第一个代码集合工作的原因(即使它也创建了MKAnnotationView)是因为代码中实际存在一个小错误:

MKAnnotationView *annotationView = [mapView dequeue...

if (annotationView == nil)
{
    MKAnnotationView *annotationView = [[MKAnnotationView alloc] init...
    //^^^^^^^^^^^^^^^^ Here, the code declares a NEW, LOCAL variable
    //                 named annotationView but it has no connection to the
    //                 annotationView declared outside the if-block.

因为在annotationView之外声明的if从未设置,所以它保持nil,这就是委托方法实际返回的内容。

当您从nil返回viewForAnnotation时,地图视图会为您创建默认视图(注释的红色图钉,用户位置的蓝点)。

要修复第一组代码,请不要声明新的本地变量。只需设置变量:

MKAnnotationView *annotationView = [mapView dequeue...

if (annotationView == nil)
{
    annotationView = [[MKAnnotationView alloc] init...

并且不要忘记设置image(或改为创建MKPinAnnotationView)。