编码多个MKAnnotations的简单方法?

时间:2011-04-13 21:12:44

标签: objective-c xcode mkmapview mkannotation mkannotationview

此代码来自MapCallouts演示。说我有数百种不同的注释。苹果公司做到这一点的方式,会导致很多代码重复。

我想访问触发委托的类实例的注释属性,无论哪个类实例触发它。

是否有一种比编写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 个答案:

答案 0 :(得分:1)

您可以让所有注释类提供一些常用方法,例如-annotationView。您可以从公共超类派生所有注释类,或者只创建一个协议。然后,检查注释是否实际响应了选择器,或者是公共类的子类,并询问它的视图:

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

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

这样做的一个原因是,您用作注释的对象通常是数据模型的一部分,并且他们可能没有任何关于注释视图的知识。能够提供标题,副标题和位置是一回事;提供视图的实际实例通常超出了模型对象应该做的范围。

请记住,除了显示图片并为标注视图提供左右配件外,注释视图通常不会做太多。您是否真的需要数百种不同的注释视图子类?或者您可以为所有注释使用通用注释视图,并且只是以不同方式配置它们(例如通过更改注释视图的图像)?