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

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

1) Apple はあなたのコードの警告について文句を言いますか?

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

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

4

3 に答える 3

20
  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は、ログ ナビゲーターに移動し、警告を含む最近のビルドを選択してログを展開すると、そこに表示されます。

    ここに画像の説明を入力

また、上で説明したように警告を抑制することもできますが、実際にはそうする必要はほとんどないことに注意してください。あなたの例を使用すると、プロジェクトの iOS 展開ターゲットが 4.3 の場合、警告は表示されません。展開ターゲットが 6.0 以降の場合、その警告が表示されますがdismissModalViewControllerAnimated、有効な iOS 5.0 では常に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
于 2013-09-01T02:02:59.003 に答える
1
  1. いいえ
  2. 特に古い iOS バージョンをサポートしようとしない限り、最新の方法を使用する必要があります。その場合は、上記で説明した方法を使用する必要があります。「非推奨として識別されたメソッドは置き換えられており、将来サポートされなくなる可能性があります。」
  3. アプリケーション ターゲットの配置ターゲットを 5.0 に変更すると、iOS 5 の非推奨の警告がエラーとして表示されなくなります。

下位互換性に本当に関心がある場合は、Ray Wenderlich による優れたチュートリアルがここにあります。

于 2013-09-01T01:56:15.070 に答える
0

はい、多くの警告が存在し、モーダルにビューを閉じて、その置換を修正します。

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

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

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

于 2013-10-21T12:23:29.600 に答える