iOS 3.1.3中的UIGestureRecognizer?

Eng*_*epe 4 iphone-sdk-3.0 universal-binary uigesturerecognizer ios

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

我目前的测试设备是带有3.1.3的iPod Touch.

以下代码导致问题:

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;
}
Run Code Online (Sandbox Code Playgroud)

根据Apple文档,UIGestureRecognizer是从iOS 3.2开始定义的.因此,我希望Class gestureReconizernil在以前的操作系统版本及以下,如果被跳过.但它不会跳过.gestureRecognizer不是nil,if开始执行和崩溃的代码,leftSwipeRecognizer.direction因为:

-[UISwipeGestureRecognizer setDirection:]: unrecognized selector sent to instance 0x1e5720
Run Code Online (Sandbox Code Playgroud)

这种情况非常令人困惑.我想我正在做这本书的一切.我尝试在使用它之前检查一个类是否存在,但是那个不应该存在的类就在那里,愚弄我的测试,不符合它的预期规格和崩溃.

我当然可以respondsToSelector在这里和那里做一些检查以解决这个崩溃,但这不是一个优雅的方法.

还有其他建议吗?

小智 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
Run Code Online (Sandbox Code Playgroud)