2011-02-26 116 views
4

我正致力於將現有的iPhone/iPad項目向下兼容到iPhoneOS 3.0。iOS 3.1.3中的UIGestureRecognizer?

我目前的測試設備是一個帶有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; 
} 

根據蘋果文檔UIGestureRecognizer定義從iOS的3.2開始。所以我期望Class gestureReconizer在以前的操作系統版本上是nil,並且以下內容是否會被跳過。但它不會跳過。 gestureRecognizernil,則if中的代碼開始於leftSwipeRecognizer.direction因爲執行和崩潰:

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

這種情況相當混亂。我想我正在做這本書的一切。我試圖在使用它之前檢查一個類是否存在,但不應該在那裏的類存在,愚弄我的測試,不符合其預期的規格,並崩潰。

我當然可以在這裏和那裏放一些respondsToSelector檢查來解決這個崩潰問題,但它不是一個很好的方法來做到這一點。

任何其他建議?

回答

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