此代码来自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;
}
答案 0 :(得分:1)
您可以让所有注释类提供一些常用方法,例如-annotationView
。您可以从公共超类派生所有注释类,或者只创建一个协议。然后,检查注释是否实际响应了选择器,或者是公共类的子类,并询问它的视图:
if ([annotation respondsToSelector:@selector(annotationView)]) {
return [annotation annotationView];
}
或
if ([annotation isKindOfClass:[AbstractAnnotation class]]) {
return [annotation annotationView];
}
不这样做的一个原因是,您用作注释的对象通常是数据模型的一部分,并且他们可能没有任何关于注释视图的知识。能够提供标题,副标题和位置是一回事;提供视图的实际实例通常超出了模型对象应该做的范围。
请记住,除了显示图片并为标注视图提供左右配件外,注释视图通常不会做太多。您是否真的需要数百种不同的注释视图子类?或者您可以为所有注释使用通用注释视图,并且只是以不同方式配置它们(例如通过更改注释视图的图像)?