环境
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实现文件中的方法调用。谁能告诉我在第二组代码上我做错了什么?
答案 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
)。