-1

问题是我有一个主类 : MyAnnotation,创建它是为了在我的 mapView 上显示注释。

@interface lieuAnnotation : MyAnnotation

@property(readonly, nonatomic) UIImage *uneImage; // I cannot access this property.

@end

我创建了第二个类lieuAnnotation,它继承自这个类,并带有一个新属性(an UIImage)。

@interface MyAnnotation : NSObject<MKAnnotation> {

    // Some variables
}

// Some methods

@end

On the map, when the pin is selected, I have set a disclosure indicator who calls the delegate method :

- (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,因为 Xcode 告诉我:

在“id”类型的对象上找不到属性“uneImage”

但在我看来,这应该是可能的!

所以我也尝试用这种方式访问​​它:

lieuAnnotation *anno = [[lieuAnnotation alloc] init];
anno = view.annotation;

[aView addSubview:anno.uneImage];

但它不起作用……</p>

感谢您的帮助和想法。

4

3 回答 3

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]));
}
于 2013-05-27T14:24:38.330 回答
0

简单的回答:您需要在访问该属性之前对其进行转换(但只有在您 100% 确定所讨论的对象具有该属性时才执行此操作,否则您将EXC_BAD_ACCESS在运行时获得一个。

说明:有问题的对象似乎id在编译时具有类型。id是 ObjC 中所有对象的泛型类型。并非所有类都有uneImage属性,因此编译器无法判断id对象是否具有该属性。编译器的想法:“让我们安全行事,不要构建”。底线:你比编译器更聪明(你现在可能已经)了。

使固定:

- (void)detailPinVue:(MKAnnotationView *)view
{
    [aView addSubview: (lieuAnnotation *)view.annotation.uneImage];
}
于 2013-05-27T14:28:22.567 回答
0

通过 .检查您的注释方式MKMapView addAnnotations:。确保您正在添加自定义类的对象。

并且您可以使用NSLog(@"%@", view.annotation.class);来了解注解的基类。

顺便提一句。你施放的方式是不必要的。 lieuAnnotation *anno = (lieuAnnotation *)view.annotation; 是正确的方法。

于 2013-05-27T14:28:58.957 回答