3

我正在尝试使用 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 没有返回零,还有什么我可以做的事情来完成我想要做的事情吗?

在此处输入图像描述

4

2 回答 2

8

文档

使用特殊注意事项

要确定某个类在给定的 iOS 版本中是否在运行时可用,您通常检查该类是否为 nil。不幸的是,这个测试对于 UIGestureRecognizer 来说并不完全准确。虽然这个类从 iOS 3.2 开始公开可用,但在此之前它还处于开发阶段。尽管该类存在于早期版本中,但该早期版本不支持使用它和其他手势识别器类。您不应尝试使用这些类的实例。

要在运行时确定您是否可以在应用程序中使用手势识别器,请测试该类是否存在,如果存在,则分配一个实例并查看它是否响应选择器 locationInView:。这个方法直到 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
于 2012-02-03T20:09:28.763 回答
2

可能发生的是 UITapGestureRecognizer 存在但在 3.1.3 中不公开。过去我很幸运地检查了 UISplitViewController。

于 2012-02-03T20:06:51.307 回答