关于NSClassFromString /检查手势识别器的困惑

时间:2012-02-03 20:01:27

标签: objective-c ios cocoa-touch ios-3.x

我正在尝试使用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,除此之外我还能做些什么来完成我想要做的事情?

enter image description here

2 个答案:

答案 0 :(得分:8)

来自docs

  

使用特殊注意事项

     

确定班级是否可用   在给定iOS版本的运行时,您通常会检查是否   上课是零。不幸的是,这个测试并不完全准确   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

答案 1 :(得分:2)

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