如何访问方法calloutAccessoryControlTapped中的注释属性

时间:2014-03-22 01:37:36

标签: ios mkmapview mkannotation mkannotationview

当用户从地图注释中点击标注时,我试图打开一个详细的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  ];

1 个答案:

答案 0 :(得分:4)

annotation中的MKAnnotationView属性通常为id<MKAnnotation>

这意味着它将指向一些实现MKAnnotation协议的对象 该协议仅定义了三个标准属性(titlesubtitlecoordinate)。

您的自定义类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);
    }
}