问题是我有一个主类:MyAnnotation
,用于在我的mapView上显示注释。
@interface lieuAnnotation : MyAnnotation
@property(readonly, nonatomic) UIImage *uneImage; // I cannot access this property.
@end
我使用新属性(lieuAnnotation
)创建了第二个继承UIImage
的类@interface MyAnnotation : NSObject<MKAnnotation> {
// Some variables
}
// Some methods
@end
。
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view
calloutAccessoryControlTapped:(UIControl *)control
{
[self detailPinVue:view]; // Personnal method
}
在地图上,当选择了引脚时,我设置了一个调用委托方法的披露指示器:
lieuAnnotation
请注意,披露指标仅针对view.annotation
个实例
因此lieuAnnotation
应该是- (void)detailPinVue:(MKAnnotationView *)view
{
[aView addSubview:view.annotation.uneImage];
}
个实例。
然后我想访问我的财产:
uneImage
事情是我无法访问该属性lieuAnnotation *anno = [[lieuAnnotation alloc] init];
anno = view.annotation;
[aView addSubview:anno.uneImage];
,因为Xcode告诉我:
在'id'类型的对象上找不到属性'uneImage'
但在我看来,它应该是可能的!
所以我也尝试用这种方式访问它:
{{1}}
但它不起作用......
感谢您的帮助和想法。
答案 0 :(得分:0)
尝试:
if ([view.annotation isKindOfClass:[lieuAnnotation class]]) {
lieuAnnotation *annotaion = (lieuAnnotation *)view.annotation;
[aView addSubview:annotation.uneImage];
} else {
NSLog(@"error %@ / %@", NSStringFromClass([view class]), NSStringFromClass([view.annotation class]));
}
答案 1 :(得分:0)
简单回答:您需要在访问属性之前强制转换它(但是只有在100%确定有问题的对象具有该属性时才执行此操作,否则您将在运行时获得EXC_BAD_ACCESS
。
说明:有问题的对象在编译时似乎具有类型id
。 id
是ObjC中所有对象的泛型类型。并非所有类都具有uneImage
属性,因此编译器无法判断id
对象是否具有该属性。编译器的想法是:“让我们安全地玩,不要构建”。底线:你比编译器更聪明(就像你现在可能已经这样)。
修正:
- (void)detailPinVue:(MKAnnotationView *)view
{
[aView addSubview: (lieuAnnotation *)view.annotation.uneImage];
}
答案 2 :(得分:0)
按MKMapView addAnnotations:
检查注释的方式。确保您要添加自定义类的对象。
您可以使用NSLog(@"%@", view.annotation.class);
来了解注释的基类。
顺便说一句。你没有必要施展方式。
lieuAnnotation *anno = (lieuAnnotation *)view.annotation;
是正确的方法。