4

我正在努力使现有的 iPhone/iPad 项目向后兼容到 iPhoneOS 3.0。

我目前的测试设备是 iPod Touch,上面有 3.1.3。

以下代码导致问题:

Class gestureRecognizer = NSClassFromString(@"UISwipeGestureRecognizer");

if (gestureRecognizer != nil)
{

    UISwipeGestureRecognizer * leftSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self 
                                                                                               action:@selector(didSwipeLeft:)];
    leftSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    leftSwipeRecognizer.delegate = self;
    [self.view addGestureRecognizer:leftSwipeRecognizer];
    _leftSwipeRecognizer = leftSwipeRecognizer;
}

根据 Apple 文档,UIGestureRecognizer 是从 iOS 3.2 开始定义的。因此,我希望Class gestureReconizer使用nil以前的操作系统版本,并且如果要跳过以下内容。但是它不会跳过。gestureRecognizer不是nil,内部的代码if开始执行并崩溃,leftSwipeRecognizer.direction因为:

-[UISwipeGestureRecognizer setDirection:]: unrecognized selector sent to instance 0x1e5720

这种情况相当混乱。我想我什么都照本宣科。我尝试在使用之前检查一个类是否存在,但是不应该存在的类存在,愚弄了我的测试,不符合预期的规范,并崩溃。

当然,我可以在这里和那里进行一些respondsToSelector检查来解决这个崩溃问题,但这不是一种优雅的方式。

还有其他建议吗?

4

1 回答 1

11

根据 UIGestureRecognizer 类参考,在"Usage Special Considerations"下,您实际上需要在检查类是否存在后进行额外的 respondsToSelector 检查。

这直接来自文档:

要确定某个类在给定的 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
于 2011-02-26T13:57:54.157 回答