关于 NSClassFromString / 检查手势识别器的困惑
Posted
技术标签:
【中文标题】关于 NSClassFromString / 检查手势识别器的困惑【英文标题】:Confusion concerning NSClassFromString / Checking for Gesture Recognizer 【发布时间】:2012-02-03 20:01:26 【问题描述】:我正在尝试使用 NSClassFromString 来阻止代码块在 ios 3.2 之前的设备上运行。有问题的代码块如下:
if (NSClassFromString(@"UITapGestureRecognizer"))
UITapGestureRecognizer *tap = [[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
[tap setCancelsTouchesInView:NO];
[[self view] addGestureRecognizer:tap];
我这样做是因为 Apple 的文档指出 UITapGestureRecognizer 与 3.2 之前的安装不兼容。 https://developer.apple.com/library/ios/#documentation/uikit/reference/UITapGestureRecognizer_Class/Reference/Reference.html
我原本以为在这个设备上运行 NSClassFromString 会返回 nil,但事实并非如此。该语句为真,代码执行。 (有趣的是,代码有点适用于 3.2 之前的安装。)
无论如何,我想知道为什么 NSClassFromString 没有返回 nil,我还能做些什么来完成我想要做的事情吗?
【问题讨论】:
【参考方案1】:来自docs
使用特殊注意事项
判断一个类是否可用 在给定 iOS 版本的运行时,您通常会检查 类是零。不幸的是,这个测试对于 UIGestureRecognizer。虽然这门课是公开的 从 iOS 3.2 开始,它在很短的时间内处于开发阶段 那。尽管该类存在于较早的版本中,但使用它和 之前不支持其他手势识别器类 释放。您不应尝试使用这些类的实例。
在运行时确定是否可以在 您的应用程序,测试该类是否存在,如果存在, 分配一个实例并查看它是否响应选择器 位置视图:。这个方法直到 iOS 3.2 才被添加到类中。 代码可能如下所示:
UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)]; if (![gestureRecognizer respondsToSelector:@selector(locationInView:)]) [gestureRecognizer release]; gestureRecognizer = nil; // do something else if gestureRecognizer is nil
【讨论】:
是的,我认为 Apple 在其中一个 WWDC 视频中也提到了这一点,这是需要注意的特殊情况。其他人之前也遇到过同样的问题:nanoant.com/apple/wanna-be-3-x-compatible-not-so-simple【参考方案2】:可能发生的是 UITapGestureRecognizer 存在但在 3.1.3 中不公开。过去我很幸运地检查了 UISplitViewController。
【讨论】:
以上是关于关于 NSClassFromString / 检查手势识别器的困惑的主要内容,如果未能解决你的问题,请参考以下文章
AnyClass 是 NSObjectProtocol... 有时?
Swift 2.1 中的 NSClassFromString
由 NSClassFromString 产生的类与头文件中定义的类不相关
OC中NSClassFromString()与NSStringFromClass()的用法及应用场景