0

此代码来自 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;
    }
4

1 回答 1

1

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

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

或者

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

这样做的一个原因是,您用作注释的对象通常是数据模型的一部分,并且它们可能对注释视图一无所知。能够提供标题、副标题和位置是一回事;提供视图的实际实例通常超出模型对象应做的范围。

请记住,注解视图通常除了显示图片并为标注视图提供左右附件之外不会做太多事情。您真的可能需要数百个不同的注释视图子类吗?或者您可以为所有注释使用一个通用的注释视图,然后以不同的方式配置它们(例如通过更改注释视图的图像)?

于 2011-04-13T21:30:59.500 回答