在 iOS 4 之前,我曾经为每个添加到 map View 的 MKAnnotationView
添加一个观察者,监听它选择的方法,所以我知道用户何时点击了图钉。
这适用于 iOS 4.2。我在发布时注意到注解 View 实际上被重用了,它以某种方式扰乱了观察者。
所以我想我可以使用 MKMapViewDelegate
中的 -mapview:didSelectAnnotationView:
方法来满足我的需要,但它只被添加到 iOS 4.0 SDK 中。
所以,为了保持兼容性,我想在我的委托(delegate)上实现这个方法,并有条件地检查 MKMapViewDelegate
协议(protocol)上是否存在这个方法,如果它不存在,我将添加我对注释 View 的观察者。
我如何为协议(protocol)方法执行此操作,类似于我们如何检查类是否为 nil?
更新:
正如 Daniel Dickison 所指出的,我不能使用 respondsToSelector:
,因为我的代表为 4.0+ 设备实现了 -mapview:didSelectAnnotationView:
。我需要的是检查该设备上的协议(protocol)是否具有可选的 -mapview:didSelectAnnotationView:
方法或 MKMapView
是否会查找该方法在它的委托(delegate)上。
我最终对当前运行的 iOS 版本进行了测试。如果它高于 4.0,MKMapView
将查找该方法并调用它。
if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 4.0)
[self setupObserver];
这解决了最初的问题,但以某种方式检查该方法的实际协议(protocol)仍然很有趣。
最佳答案
因为没有对象实例,您可以询问它是否响应消息选择器,并且您已经知道支持该协议(protocol),但您只是在其中寻找一种方法 - 您需要使用 protocol_getMethodDescription
,就像这样(方法是类实例和可选的),您在其中检查 nil 返回值:
#import <objc/runtime.h>
struct objc_method_description hasMethod = protocol_getMethodDescription(@protocol(MKMapViewDelegate), @selector(mapView:didSelectAnnotationView:), NO, YES);
if ( hasMethod.name != NULL )
{
...
}
关于iphone - 如何测试方法的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4271454/