Нераспознанный селектор отправлен на экземпляр? - PullRequest
0 голосов
/ 24 февраля 2012

Я видел, что у некоторых других тоже была эта проблема. Я пытаюсь следовать интерактивному учебнику, в котором показано, как создавать анимированные булавки в 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;

Любая помощь очень ценится.

EDIT: Вот это 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

А м.м.

#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 ]

1 голос
/ 24 февраля 2012

Вы отправляете сообщение в аннотацию, но у вас, похоже, есть подклассы представления аннотации.

1 голос
/ 24 февраля 2012

В строке

Place *place = (Place *)annotation;

имеется переменная место класса переменной аннотации (MKPointAnnotation), таким образом вы не можете перенести переменную мастер-класса в подкласс.Вместо этого вам нужно будет создать конструктор для Place из MKPointAnnotation и выполнить проверку в методе setAnnotation, что аннотация имеет MKPointAnnotation.

1 голос
/ 24 февраля 2012

Вы не можете преобразовать MKAnnotation в Place, просто применив его. Эта строка неверна.

Place *place = (Place *)annotation;

Вы должны опубликовать свои Place.h и Place.m файлы, если вы все еще застряли. Вам нужно либо установить свойство iconN для нового объекта Place, либо создать метод init в классе Place, который принимает объект MKAnnotation в качестве параметра и соответственно устанавливает собственные внутренние значения.

0 голосов
/ 28 февраля 2012

Публикация в качестве ответа того, что изначально было просто комментарием:

Я не знаком с MapKit, но вот что меня выделяет в этом: - [MKPointAnnotation iconN]: нераспознанный селектор, отправленный экземпляру, это то, что класс - MKPointAnnotation. Таким образом, полученная вами аннотация на самом деле не является объектом Place, это объект MKPointAnnotation - вы не можете просто привести его к Place. Я подозреваю, что корень вашей проблемы заключается в том, где вы сначала создаете объект аннотации.

...