Metode barunya adalah:
[self dismissViewControllerAnimated:NO completion:nil];
Kata modal telah dihapus; Seperti yang telah dilakukan untuk menyajikan panggilan API:
[self presentViewController:vc animated:NO completion:nil];
Alasannya dibahas dalam Sesi WWDC 2012 236 - Evolusi Pengontrol Tampilan di Video iOS . Pada dasarnya, pengontrol tampilan yang disajikan oleh API ini tidak lagi selalu modal, dan karena mereka menambahkan penangan penyelesaian, inilah saat yang tepat untuk mengganti namanya.
Menanggapi komentar dari Marc:
Apa cara terbaik untuk mendukung semua perangkat 4.3 ke atas? Metode baru tidak berfungsi di iOS4, namun metode lama tidak digunakan lagi di iOS6.
Saya menyadari bahwa ini hampir merupakan pertanyaan terpisah, tetapi saya pikir ini layak untuk disebutkan karena tidak semua orang memiliki uang untuk meningkatkan semua perangkat mereka setiap 3 tahun sehingga banyak dari kita memiliki beberapa perangkat yang lebih tua (sebelum 5.0). Namun, meskipun menyakitkan saya untuk mengatakannya, Anda perlu mempertimbangkan apakah itu layak untuk menargetkan di bawah 5.0. Ada banyak API baru dan keren yang tidak tersedia di bawah 5.0. Dan Apple terus mempersulit target mereka; dukungan armv6 dihapus dari Xcode 4.5, misalnya.
Untuk menargetkan di bawah 5.0 (selama blok penyelesaiannya nihil) cukup gunakan metode praktis respondsToSelector
:
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Menanggapi komentar lain dari Marc:
Itu bisa cukup banyak pernyataan If dalam aplikasi saya! ... Saya berpikir untuk membuat kategori yang merangkum kode ini, apakah membuat kategori di UIViewControler membuat saya ditolak?
dan satu dari Full Decent:
... apakah ada cara untuk menyebabkannya tidak menampilkan peringatan compiler secara manual?
Pertama, tidak, membuat kategori dengan UIViewController
sendirinya tidak akan membuat aplikasi Anda ditolak; kecuali metode kategori itu disebut API pribadi atau yang serupa.
Metode kategori adalah tempat yang sangat bagus untuk kode semacam itu. Selain itu, karena hanya akan ada satu panggilan ke API yang tidak digunakan lagi, hanya akan ada satu peringatan compiler.
Untuk menjawab komentar Full Decent (pertanyaan), ya, Anda dapat menyembunyikan peringatan compiler secara manual. Berikut ini tautan ke jawaban tentang SO tentang subjek itu . Metode kategori juga merupakan tempat yang tepat untuk menyembunyikan peringatan compiler, karena Anda hanya menyembunyikan peringatan di satu tempat. Anda tentunya tidak ingin berkeliling membungkam kompiler secara sembarangan.
Jika saya menulis metode kategori sederhana untuk ini, mungkin akan seperti ini:
@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