新しい方法は次のとおりです。
[self dismissViewControllerAnimated:NO completion:nil];
モーダルという単語は削除されました。現在のAPI呼び出しの場合と同様に:
[self presentViewController:vc animated:NO completion:nil];
その理由は、2012年のWWDCセッション236-iOSビデオのビューコントローラーの進化で説明されています。基本的に、このAPIによって提供されるビューコントローラーは常にモーダルではなくなり、完了ハンドラーを追加していたので、名前を変更する良い機会でした。
Marcからのコメントに応じて:
4.3以上のすべてのデバイスをサポートする最良の方法は何ですか?新しい方法はiOS4では機能しませんが、古い方法はiOS6では非推奨です。
私はこれがほぼ別の質問であることを理解していますが、誰もが3年ごとにすべてのデバイスをアップグレードするためのお金を持っているわけではないので、私たちの多くが古い(5.0より前の)デバイスを持っているので、言及する価値があると思います。それでも、私がそれを言うのが苦痛である限り、5.0未満を対象とする価値があるかどうかを検討する必要があります。5.0未満では利用できない新しいAPIがたくさんあります。そしてAppleは絶えずそれらをターゲットにすることを難しくしています。たとえば、armv6サポートはXcode 4.5から削除されました。
5.0未満をターゲットにするには(完了ブロックがnilである限り)、便利なrespondsToSelector
:メソッドを使用します。
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Marcからの別のコメントへの応答:
これは、アプリケーションのIfステートメントでかなり多くなる可能性があります!...このコードをカプセル化するカテゴリを作成することを考えていましたが、UIViewControlerでカテゴリを作成すると拒否されますか?
フルディセントの1つ:
...コンパイラの警告を表示しないように手動で設定する方法はありますか?
まず、いいえ、UIViewController
それ自体でカテゴリを作成しても、アプリが拒否されることはありません。そのカテゴリメソッドがプライベートAPIまたは同様のものを呼び出さない限り。
カテゴリメソッドは、このようなコードに非常に適した場所です。また、廃止されたAPIへの呼び出しは1つしかないため、コンパイラ警告は1つしかありません。
Full Decentのコメント(質問)に対処するには、コンパイラの警告を手動で抑制できます。これがまさにその主題に関するSOの回答へのリンクです。警告を1か所で抑制するだけなので、カテゴリメソッドもコンパイラの警告を抑制するのに最適な場所です。コンパイラを無意味に黙らせることは避けた方がいいでしょう。
このための単純なカテゴリメソッドを作成する場合は、次のようになります。
@implementation UIViewController (NJ_ModalPresentation)
-(void)nj_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{
NSAssert(completion == nil, @"You called %@ with a non-nil completion. Don't do that!",NSStringFromSelector(_cmd));
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:viewControllerToPresent animated:flag completion:completion];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[self presentModalViewController:viewControllerToPresent animated:flag];
#pragma clang diagnostic pop
}
}
@end