无法识别的选择器发送到实例?

时间:2012-02-23 22:12:21

标签: iphone objective-c xcode ios5 mapkit

我已经看到其他一些人也遇到过这个问题。 我正在尝试在线学习如何在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

4 个答案:

答案 0 :(得分:1)

您只能通过投射将MKAnnotation转换为Place。这条线错了。

Place *place = (Place *)annotation;

如果您仍然卡住,则应发布Place.hPlace.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。我怀疑问题的根源在于您首先创建注释对象的位置。