如何访问方法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 ];
MKAnnotationView
的annotation
属性MKAnnotationView
被键入为id<MKAnnotation>
。
这意味着它会指向一些实现MKAnnotation
协议的对象。
该协议只定义了三个标准属性( title
, subtitle
和coordinate
)。
您的自定义类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); } }