自定义注释,“访问未知的getter方法”

时间:2010-05-18 14:42:05

标签: iphone annotations mapkit getter-setter

我已经制作了一个自定义的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副本。

1 个答案:

答案 0 :(得分:3)

尝试将点符号的行更改为:

NSString *str2=[annotation title2];

并且错误应该消失。

正在发生的事情是编译器被告知注释是MKAnnotation。事实上,你知道它有什么其他方法是无关紧要的;编译器不是通灵的 - 它只知道注释遵循MKAnnotation协议,仅此而已。它看到标题吸气剂的原因是因为标题是在MKAnnotation中定义的。

您还可以使用强制转换来解决此问题:

MapLocation *mapLocation = (MapLocation *)annotation;

现在,你可以说

NSString *str2=mapLocation.title2;

因为您告诉编译器mapLocation是MapLocation obejct。