iphone - 如何测试方法的协议(protocol)?

标签 iphone objective-c cocoa cocoa-touch mapkit

在 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/

相关文章:

iphone - 在 Objective-C 中动态实例化类,可能吗?

javascript - ios 上的音频无法正常工作,仅第一次可以工作

iphone - 从 NSDictionary 中提取 CGFloat 的语法

iphone - 在 iOS 中读取 PPT、xls 和 .doc 文件的 SDK

ios - 调用 UIView initWithFrame 即使从 NIB 加载自身?

iphone - 非常奇怪的 UIView 位置问题

objective-c - NSArrayController 删除 :nil - understanding the nil

cocoa - theEvent charactersIgnoringModifiers - 获取不带修饰符的字符

java - aes 加密 - 内容大小不是 16 字节的倍数

Objective-C:将 NSData 转换为 int 或 char