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

我想打开一个详细的viewController当用户点击从地图注释的标注。

我创build了一个名为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 ]; 

MKAnnotationViewannotation属性MKAnnotationView被键入为id<MKAnnotation>

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

您的自定义类myAnnotation实现了MKAnnotation协议,因此具有三个标准属性,但也有一些自定义属性。

由于annotation属性通常是键入的,因此编译器只知道三个标准属性,并在尝试访问不属于标准协议的自定义属性时发出警告或错误。

为了让编译器知道这种情况下的annotation对象是myAnnotation一个实例,你需要myAnnotation转换它,这样它可以让你在没有警告或错误的情况下访问自定义属性(代码完成也将帮助你)。

在投射之前,重要的一点是检查对象是否使用isKindOfClass: 如果将一个对象转换为一个实际不是的types,那么很可能最终会在运行时产生exception。

例:

 - (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); } }