Более простой способ закодировать несколько MKAnnotations?

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

Одна из причин, по которой не следует этого делать, заключается в том, что объекты, которые вы используете в качестве аннотаций, часто являются частями вашей модели данных, и они могут не иметь никакого отношения к знаниям о представлениях аннотаций. Одно дело иметь возможность указывать заголовок, субтитры и местоположение; предоставление фактического экземпляра представления часто выходит за рамки того, что должен делать объект модели.

Имейте в виду, что представления аннотаций обычно не делают слишком многого, кроме отображения изображения и предоставления левого и правого аксессуаров для представления выноски. Действительно ли вероятно, что вам понадобятся сотни различных подклассов представления аннотаций? Или вы можете использовать общий вид аннотаций для всех ваших аннотаций и просто настроить их по-другому (например, изменив изображение в виде аннотаций)?