此处发布的许多问题中的错误都是一样的,但我猜原因是不同的。
我有3个类:MapView.m
,用于显示地图及其绘制的图钉。 Pins.m
管理所有引脚数据,PinsCalloutAnnotationView.m
从MKAnnotationView
延伸并管理注释的标注。
我的问题出在本课程中,PinsCalloutAnnotationView.m
:
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
if (((Pins*)annotation).isHootPin) {
[self updateHootPin:t.hoot];
}
return self;
}
当我尝试阅读属性isHootPin
时,应用程序崩溃,我得到了这个堆栈:
[PinsCalloutAnnotationView isHootPin]: unrecognized selector sent to instance 0x203312d0
该属性在Pins
类中非常合成:
@property (nonatomic, readwrite)BOOL isHootPin;
和
@synthesize isHootPin;
我在MapView.m
pin.isHootPin=YES;
这有什么问题吗?提前完成。
修改
调用initWithAnnotation
方法的类是MapView
。
- (MKAnnotationView *)mapView:(MKMapView *)mapV viewForAnnotation:(id<MKAnnotation>)annotation
{
MKAnnotationView *annotationView;
if ([annotation isMemberOfClass:[Pins class]]) {
if (((Pins *)annotation).isHootPin) {
NSString * annotationId = @"hootpin";
annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationId];
if (!annotationView) {
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationId];
}
}
}
}
正如您所看到的,在致电initWithAnnotation
之前,我进行了测试,其中属性isHootPin
设置为是,如果是,我会调用initWithAnnotation
。即使在initWithAnnotation
中,我也需要确保注释isHootPin
是否为是。如果是,我会为注释执行特定的布局配置。所以:
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
if (((Pins*)annotation).isHootPin) {//Try to check, but get crash and exception
[self updateHootPin:t.hoot];
}
return self;
}