在iOS 4之前,我曾经为添加到地图视图中的每个MKAnnotationView
添加了一个观察者,监听它的选定方法,因此我知道用户何时点击了某个图钉。如何测试方法的协议?
这工作正常到iOS 4.2。我注意到,在发布的注释视图实际上被重用,并以某种方式与观察者混淆。
因此,我想我可以使用MKMapViewDelegate
中的-mapview:didSelectAnnotationView:
方法来满足我的需求,但这只是添加到iOS 4.0 SDK中。
因此,为了保持兼容性,我想在我的代理上实现此方法,并有条件地检查MKMapViewDelegate
协议中是否存在此方法,以便如果它不存在,我将添加我的观察者到注释视图。
我该如何做一个协议方法,类似于我们如何检查一个类是不是零?
UPDATE:
正如丹尼尔Dickison指出的那样,我不能使用respondsToSelector:
,因为我的委托已实施了4.0+设备-mapview:didSelectAnnotationView:
。我需要的是检查该设备上的协议是否有可选-mapview:didSelectAnnotationView:
方法或如果MKMapView
将在其代理上查找该方法。
我结束了对当前运行的iOS版本的测试。如果它高于4.0,MKMapView
将查找该方法并调用它。
if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 4.0)
[self setupObserver];
这解决了原来的问题,但它仍然将是有趣的检查实际协议的方法,不知何故。
克里斯 - 你可能不想使用保留关键字选择SEL作为变量名称。 – DHamrick 2010-11-24 21:34:48
@DHamrick,你是绝对正确的......很愚蠢......我很快就写下了它,并有一个脸掌... – 2010-11-24 23:02:47
你不能使用“respondsToSelector”,因为你会问它的唯一对象是你自己!你需要知道MKMapView是否会从委托中寻找这种方法... – 2010-11-24 23:14:39