我已经看到其他一些人也遇到过这个问题。 我正在尝试在线学习如何在MapView上创建动画图钉的教程。
我已经实现了教程中显示的代码,项目构建正常,除了我收到此异常:
-[MKPointAnnotation iconN]: unrecognized selector sent to instance
我有一个'MKPinAnnotationView'的子类,在.m文件中我创建了这个方法:
- (void)setAnnotation:(id<MKAnnotation>)annotation {
[super setAnnotation:annotation];
//Place *place = [[Place alloc] init];
Place *place = (Place *)annotation;
//The following line is where the program sends "SIGABRT"
icon = [UIImage imageNamed:[NSString stringWithFormat:@"pin_%d.png", [place.iconN intValue]]];
[iconView setImage:icon];
}
以下是我的“模型”中的一些部分,称为Place.h / .m。 这是我为'iconN'创建属性的地方。
@property (retain, nonatomic) NSNumber *iconN;
在这里我合成它:
@synthesize iconN = _iconN;
非常感谢任何帮助。
编辑: 这是Place.h和Place.m
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface Place : NSObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString *title;
}
@property (retain, nonatomic) NSNumber *iconN;
@property (nonatomic, copy) NSString *title;
@property (nonatomic) CLLocationCoordinate2D coordinate;
- (id)initWithLong:(CGFloat)lon Lat:(CGFloat)lat iconNumber:(NSNumber *)iconNumber;
@end
Place.m
#import "Place.h"
@implementation Place
@synthesize coordinate;
@synthesize iconN = _iconN;
@synthesize title;
- (id)initWithLong:(CGFloat)lon Lat:(CGFloat)lat iconNumber:(NSNumber *)iconNumber {
self = [super init];
if (self) {
coordinate = CLLocationCoordinate2DMake(lat, lon);
self.iconN = iconNumber;
}
return self;
}
- (NSString *)title {
return [NSString stringWithFormat:@"Bus: %d", [self.iconN intValue]];
}
- (NSString *)subtitle {
return [NSString stringWithFormat:@"bus[%d] from database.", [self.iconN intValue] - 1];
}
@end
答案 0 :(得分:1)
您只能通过投射将MKAnnotation
转换为Place
。这条线错了。
Place *place = (Place *)annotation;
如果您仍然卡住,则应发布Place.h
和Place.m
个文件。您需要在新的Place对象上设置iconN属性,或者在Place类中创建一个接受MKAnnotation
对象作为参数的init方法,并相应地设置它自己的内部值。
答案 1 :(得分:1)
您正在将消息发送到注释,但您似乎具有注释视图的子类。
答案 2 :(得分:1)
在第
行Place *place = (Place *)annotation;
具有注释变量类(MKPointAnnotation)的可变位置,您无法以这种方式将主类变量引入子类。相反,您必须从MKPointAnnotation为Place创建构造函数,并在注释为MKPointAnnotation的setAnnotation方法中执行检查。
答案 3 :(得分:0)
发布最初只是评论的答案:
我对MapKit并不熟悉,但在这方面对我有用的东西: - [MKPointAnnotation iconN]:发送到实例的无法识别的选择器是该类是MKPointAnnotation。因此,您收到的注释实际上不是Place对象,而是MKPointAnnotation对象 - 您不能只是转换为Place。我怀疑问题的根源在于您首先创建注释对象的位置。