当用户从地图注释中点击标注时,我试图打开一个详细的viewController。
我创建了一个名为myAnnotation的自定义注释子类,我在其中包含了一个名为idEmpresa的属性。
在自定义方法中,我按如下方式声明注释:
double latitud = [[[categorias objectAtIndex:i] objectForKey:@"latitud"] doubleValue];
double longitud = [[[categorias objectAtIndex:i] objectForKey:@"longitud"]doubleValue];
CLLocationCoordinate2D lugar;
lugar.latitude = latitud;
lugar.longitude = longitud;
NSString *nombre = [[categorias objectAtIndex:i] objectForKey:@"titulo"];
CLLocationCoordinate2D coordinate3;
coordinate3.latitude = latitud;
coordinate3.longitude = longitud;
myAnnotation *annotation3 = [[myAnnotation alloc] initWithCoordinate:coordinate3 title:nombre ];
annotation3.grupo = 1;
int number = [[[categorias objectAtIndex:i] objectForKey:@"idObjeto"] intValue];
annotation3.idEmpresa = number;
NSLog(@"ESTA ES LA ID DE LA EMPRESA %d",number);
[self.mapView addAnnotation:annotation3];
您可能会看到注释具有属性annotation3.idEmpresa
。
然后,在方法calloutAccessoryControlTapped
,我需要有权访问此属性。我知道如何访问该方法中的注释标题和副标题:
NSString *addTitle = [[view annotation] title ];
NSString *addSubtitle = [[view annotation] subtitle ];
但它不适用于属性idEmpresa
NSString *addTitle = [[view annotation] title ];
答案 0 :(得分:4)
annotation
中的MKAnnotationView
属性通常为id<MKAnnotation>
。
这意味着它将指向一些实现MKAnnotation
协议的对象
该协议仅定义了三个标准属性(title
,subtitle
和coordinate
)。
您的自定义类myAnnotation
实现了MKAnnotation
协议,因此具有三个标准属性,但也有一些自定义属性。
由于annotation
属性通常是类型化的,因此编译器只知道三个标准属性,并在尝试访问不在标准协议中的自定义属性时发出警告或错误。
为了让编译器知道annotation
对象在这种情况下是具体 myAnnotation
的实例,你需要将其转换为允许你访问没有警告或错误的自定义属性(代码完成也将开始帮助您)。
在投射之前,使用isKindOfClass:
检查对象是否真的属于您要将其强制转换为的类型非常重要。如果将对象转换为实际上不属于的类型,则很可能最终会在运行时生成异常。
示例:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
if ([view.annotation isKindOfClass:[myAnnotation class]])
{
myAnnotation *ann = (myAnnotation *)view.annotation;
NSLog(@"ann.title = %@, ann.idEmpresa = %d", ann.title, ann.idEmpresa);
}
}