无法访问个人类的已定义属性

时间:2013-05-27 14:16:36

标签: ios objective-c xcode mkannotation

问题是我有一个主类: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}}

但它不起作用......

感谢您的帮助和想法。

3 个答案:

答案 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

说明:有问题的对象在编译时似乎具有类型idid是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;  是正确的方法。