#objective-c #xcode #mkmapview #mkannotation #mkannotationview
#objective-c #xcode #mkmapview #mkannotation #mkannotationview
Вопрос:
Этот код взят из демо-версии MapCallouts. Допустим, у меня были сотни различных аннотаций. То, как Apple это сделала, привело бы к большому дублированию кода.
Я хочу получить доступ к свойствам аннотации экземпляра класса, который вызвал делегирование, независимо от того, какой экземпляр класса его вызвал.
Есть ли более простой способ, чем написание операторов if для обработки каждой аннотации, и имеющий один универсальный метод?
- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// handle our two custom annotations
//
if ([annotation isKindOfClass:[BridgeAnnotation class]]) // for Golden Gate Bridge
{
//do something
}
else if ([annotation isKindOfClass:[SFAnnotation class]]) // for City of San Francisco
{
//do something
}
return nil;
}
Ответ №1:
Вы могли бы заставить все ваши классы аннотаций предоставлять какой-нибудь общий метод, например -annotationView
. Вы могли бы вывести все классы аннотаций из общего суперкласса или просто создать протокол. Затем проверьте, действительно ли аннотация реагирует на селектор или является подклассом вашего общего класса, и запросите его представление:
if ([annotation respondsToSelector:@selector(annotationView)]) {
return [annotation annotationView];
}
или
if ([annotation isKindOfClass:[AbstractAnnotation class]]) {
return [annotation annotationView];
}
Одна из причин, по которой не следует этого делать, заключается в том, что объекты, которые вы используете в качестве аннотаций, часто являются частями вашей модели данных, и они могут не иметь никакого отношения к знаниям о представлениях аннотаций. Одно дело иметь возможность указывать заголовок, субтитры и местоположение; предоставление фактического экземпляра представления часто выходит за рамки того, что должен делать объект модели.
Имейте в виду, что представления аннотаций обычно не делают слишком многого, кроме отображения изображения и предоставления левого и правого аксессуаров для представления выноски. Действительно ли вероятно, что вам понадобятся сотни различных подклассов представления аннотаций? Или вы можете использовать общий вид аннотаций для всех ваших аннотаций и просто настроить их по-другому (например, изменив изображение в виде аннотаций)?