iOS 3.1.3中的UIGestureRecognizer?

时间:2011-02-26 12:06:10

标签: ios iphone-sdk-3.0 uigesturerecognizer universal-binary

我正在努力使现有的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;
}

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

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

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

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

还有其他建议吗?

1 个答案:

答案 0 :(得分:11)

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

这直接来自文档:

  

确定一个班级是否   在给定的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