web-dev-qa-db-ja.com

xcodeの非推奨の警告と非推奨の処理方法

if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
     {[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];} //post-iOS6.0
else {[self dismissModalViewControllerAnimated:YES];} //pre-iOS6.0

非推奨のメソッドを処理するために、セレクター(上記)コードへの応答を行っています。そうすれば、私のアプリは古いバージョンのiOSと互換性がありますが、コードに「 'dismissModalViewControllerAnimated:'は非推奨です:iOS6.0で最初に非推奨になりました」という警告が表示されます。さらに重要なことに、私はどこかでAppleがあなたのコードの警告について文句を言うだろうと読んだ。

1)Appleコードの警告について文句を言うでしょうか?

2)非推奨のメソッドを正しく処理していますか?

3)非推奨のメソッドメソッドの警告をオフにする方法はありますか?

15
ConfusedDeer
  1. Appleは、コードで受け取るコンパイル時の警告を認識していません。

  2. はい、あなたはこの慣習を正しく扱っています。明らかに、この場合、5.0より前のiOSをサポートしている場合にのみ、この作業を行う必要があります。ただし、一般に、メソッドを呼び出すことができるかどうかをテストしてから、適切なレンディションを呼び出す手法は完全に正しいものです。

  3. 警告をオフにしたい場合は、警告を一時的に抑制し、その後、適切な#pragma構文を使用して再度オンにします。

    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
    {
        //post-iOS6.0
        [self dismissViewControllerAnimated:YES completion:nil];
    } 
    else
    {
        // pre-iOS6.0
    #pragma clang diagnostic Push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        [self dismissModalViewControllerAnimated:YES];
    #pragma clang diagnostic pop
    }
    

    ちなみに、特定の警告の-Wコードが何であるかを知りたい場合は、ログナビゲーターに移動し、警告を含む最近のビルドを選択して、ログを展開すると、そこに表示されます。 :

    enter image description here

また、上で説明したように警告を抑制することはできますが、実際には、そうする必要はめったにないことにも注意してください。あなたの例を使用すると、プロジェクトのiOSデプロイメントターゲットが4.3の場合、警告は表示されません。また、デプロイターゲットが6.0以上の場合は警告が表示されますが、iOS 5.0ではいつでもdismissModalViewControllerAnimatedを使用できるため、dismissViewControllerAnimatedを呼び出すためにこの条件付きコードはおそらく必要ありません。

コードでこの警告を抑制する必要があるのは、将来プロジェクトに含まれるソースコードがあり、デプロイメントターゲットが何であるかがわからない場合のみです。あなたの例を使用して、上記のコードが4.3デプロイメントターゲットまたは5.0+デプロイメントターゲットのプロジェクトに含まれるかどうかわからない場合。その場合、この構文は非常に便利です。しかし、繰り返しになりますが、__IPHONE_OS_VERSION_MIN_REQUIREDで条件付きチェックを使用することもできます。例:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
    {
        //post-iOS5.0
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else
    {
        // pre-iOS5.0
        [self dismissModalViewControllerAnimated:YES];
    }
#else
    [self dismissViewControllerAnimated:YES completion:nil];
#endif
19
Rob
  1. 番号
  2. 特に古いiOSバージョンをサポートしようとしているのでない限り、最新の方法を使用する必要があります。その後、上記で概説した方法を使用する必要があります。 「非推奨として識別されたメソッドは置き換えられ、将来サポートされなくなる可能性があります。」
  3. アプリケーションターゲットのデプロイメントターゲットを5.0に変更した場合、iOS5の非推奨の警告はエラーとして表示されません。

下位互換性に本当に興味がある場合は、Ray Wenderlichによるすばらしいチュートリアルがあります ここ

1
Kevin

はい多くの警告が存在し、その置換を修正するためにビューをモーダルに却下します。

iOS 6では、これらは次のとおりです。-

  1. [self dismissViewControllerAnimated:NO completion:nil];

  2. [self presentViewController:vc animated:NO completion:nil];

0
Gaurav