我正在努力使现有的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
不是nil
,if
内的代码开始执行并在leftSwipeRecognizer.direction
崩溃,原因是:
-[UISwipeGestureRecognizer setDirection:]: unrecognized selector sent to instance 0x1e5720
这种情况非常令人困惑。我想我正在做这本书的一切。我尝试在使用它之前检查一个类是否存在,但是那个不应该存在的类就在那里,愚弄我的测试,不符合它的预期规格和崩溃。
我当然可以在这里和那里进行一些respondsToSelector
检查来解决这个问题,但这不是一个优雅的方法。
还有其他建议吗?
答案 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