2010-05-18 98 views
0

我制作了一个自定义的MKAnnotation类MapLocation。我没有麻烦设置或获取属性,除了在这个方法来创建一个MKAnnotationView。我需要在这里做,因为它应该从注解的索引中查找位置类型,并为annotationView选择一系列自定义注释图像。自定义注释'访问未知的getter方法'

经过多次尝试在MapLocation.h和.m中设置自定义getter和setter,我将它归结到我无法复制(强制性)getter,title的地方,将其重命名为title2,并尝试得到它的回报价值。这是我的代码:

-(MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { 
static NSString *[email protected]"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副本。

回答

3

尝试改变线从点符号这样的:

NSString *str2=[annotation title2]; 

和错误应该消失。

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

您也可以使用强制解决这个问题:

MapLocation *mapLocation = (MapLocation *)annotation; 

现在,你可以说

NSString *str2=mapLocation.title2; 

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

+0

当我看到你已经回答时,我实际上正在研究如何声明MapLocation协议。因此,现在我的注释有索引,可将它们链接到我需要的任何地方,并显示该类型位置的正确图像。谢谢! 虽然这并没有工作(我曾尝试过):NSString * str2 = [annotation title2]; 它说-title2是未知的。无助于在界面中声明它。对于像我这样的新手来说有点奇怪,“因为编译器不应该担心消息,所以它们是运行时的”。我现在明白,如果没有演员就会抱怨额外的属性,谢谢! – 2010-05-18 15:42:20