4

私は、既存の 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 以降で定義されています。したがって、私は以前の OS バージョンを使用していることを期待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 に答える