2012-02-23 3 views
0

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

И 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 
+1

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

+0

Does Place реализует протокол MKAnnotation? Является ли «аннотация» своего рода местом? Другими словами, '[аннотация isKindOfClass: [Place class]]' return true? – mamills

+0

@pmjordan Ты прибил его! Я вернулся и просмотрел свой проект. Я добавил три других аннотации, используя метод addAnnotations: 'и по какой-то причине метод setAnnotation вызывается, когда я добавлял их, даже если они не были объектами «Place». Может быть, я должен проверить, является ли объект, передаваемый сначала объектом «Место», а если нет, ничего не делать? –

ответ

1

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

Place *place = (Place *)annotation; 

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

1

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

1

В строке

Place *place = (Place *)annotation; 

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

0

проводок в ответ, что первоначально был просто комментарий:

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

Смежные вопросы