我已经制作了一个自定义的MKAnnotation类MapLocation。我在设置或获取属性方面没有任何问题,除了在此方法中创建MKAnnotationView。我需要在这里做,因为它应该从注释的索引中查找位置类型,并为annotationView选择一系列自定义注释图像。
经过多次尝试在MapLocation.h和.m中设置自定义getter和setter之后,我把它归结为我甚至无法复制(强制性)getter,title,将其重命名为title2,并尝试获取它的回报价值。这是我的代码:
-(MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *placemarkIdentifier=@"Map Location Identifier";
NSString *str1=annotation.title;
NSString *str2=annotation.title2;
if([annotation isKindOfClass:[MapLocation class]]) {
MKAnnotationView *annotationView=(MKAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:placemarkIdentifier];
if (annotationView==nil) {
annotationView=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placemarkIdentifier];
}
else
annotationView.annotation=annotation;
return annotationView;
}
return nil;
}
在第4行,正确返回标题,但第5行调用复制的方法会在主题中产生错误消息。
我确实查看了XCode文档,但我可能只是没有得到如何声明它所以这个方法看到它。奇怪的是,它看到了标题获取者,但没有看到title2副本。
答案 0 :(得分:3)
尝试将点符号的行更改为:
NSString *str2=[annotation title2];
并且错误应该消失。
正在发生的事情是编译器被告知注释是MKAnnotation
。事实上,你知道它有什么其他方法是无关紧要的;编译器不是通灵的 - 它只知道注释遵循MKAnnotation协议,仅此而已。它看到标题吸气剂的原因是因为标题是在MKAnnotation中定义的。
您还可以使用强制转换来解决此问题:
MapLocation *mapLocation = (MapLocation *)annotation;
现在,你可以说
NSString *str2=mapLocation.title2;
因为您告诉编译器mapLocation是MapLocation obejct。