Более простой способ кодировать несколько MKAnnotations? - PullRequest
0 голосов
/ 14 апреля 2011

Этот код взят из демоверсии 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 Ответ

1 голос
/ 14 апреля 2011

У всех ваших классов аннотаций может быть какой-то распространенный метод, например -annotationView.Вы можете получить все классы аннотаций из общего суперкласса или просто создать протокол.Затем проверьте, что аннотация действительно отвечает селектору или является подклассом вашего общего класса, и запросите его для просмотра:

if ([annotation respondsToSelector:@selector(annotationView)]) {
    return [annotation annotationView];
}

или

if ([annotation isKindOfClass:[AbstractAnnotation class]]) {
    return [annotation annotationView];
}

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

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

...