Пользовательская аннотация «Доступ к неизвестному методу получения» - PullRequest
0 голосов
/ 18 мая 2010

Я создал пользовательский класс MKAnnotation, MapLocation. У меня нет проблем с настройкой или получением свойств, кроме этого метода для создания MKAnnotationView. Мне нужно сделать это здесь, так как он должен искать тип местоположения по индексу аннотации и выбирать одно из семейства пользовательских изображений аннотаций для annotationView.

После многочисленных попыток настроить пользовательские методы получения и установки в MapLocation.h и .m я свел его к тому месту, где я даже не могу скопировать (обязательный) метод получения, название, переименовать его в title2 и попытаться его возвращаемое значение. Это мой код:

-(MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *placemarkIdentifier=@"Map Location Identifier";
NSString *str1=annotation.title;
NSString *str2=annotation.title2;
if([annotation isKindOfClass:[MapLocation class]]) {
    MKAnnotationView *annotationView=(MKAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:placemarkIdentifier];
    if (annotationView==nil) {
        annotationView=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placemarkIdentifier];
    }
    else
        annotationView.annotation=annotation;


    return annotationView;
}
return nil;

}

В 4-й строке заголовок возвращается правильно, но вызов 5-й строки скопированного метода выдает сообщение об ошибке в теме.

Я заглянул в документы по XCode, но я, вероятно, просто не понимаю, как это объявить, чтобы этот метод его видел. Странно, что он видит получатель заголовка, но не копию title2.

1 Ответ

3 голосов
/ 18 мая 2010

Попробуйте изменить строку с точечного обозначения на это:

NSString *str2=[annotation title2];

и ошибка должна исчезнуть.

Что происходит, так это то, что компилятору сообщили, что аннотация - MKAnnotation. Тот факт, что вы знаете, какие у него есть другие методы, не имеет значения; компилятор не экстрасенсорный - все, что он знает, это то, что аннотация следует протоколу MKAnnotation, не более Причина, по которой он видит средство получения заголовка, заключается в том, что заголовок определен в MKAnnotation.

Вы также можете исправить это, используя приведение:

MapLocation *mapLocation = (MapLocation *)annotation;

Теперь вы можете сказать

NSString *str2=mapLocation.title2;

потому что вы сказали компилятору, что mapLocation является объектом MapLocation.

...