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
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ [self presentViewController:test animated:YES completion:nil]; } else { [self presentModalViewController:test animated:YES]; }
apakah ada cara untuk menyebabkannya secara manual agar tidak menampilkan peringatan kompiler?Sekarang di iOS 6 dan lebih tinggi, Anda dapat menggunakan:
Dari pada:
... Dan Anda dapat menggunakan:
Dari pada
sumber
[self dismissModalViewControllerAnimated:NO];
sudah tidak digunakan lagi.Gunakan
[self dismissViewControllerAnimated:NO completion:nil];
sebagai gantinya.sumber
Menggunakan
sumber
Peringatannya masih ada. Untuk menghilangkannya, saya memasukkannya ke selektor seperti ini:
Ini bermanfaat bagi orang dengan OCD seperti saya;)
sumber
respondsToSelector
mengembalikan false. Dengan demikian, yang barudismissViewControllerAnimated:
tidak akan pernah dipanggil sampai pembaruan di masa mendatang di mana mereka mungkin menghapusdismissModalViewControllerAnimated:
semuanya.Berikut adalah versi presentViewController yang sesuai yang saya gunakan jika membantu pemula lain seperti saya:
Saya telah menggunakan ViewController 'secara umum' dan bisa mendapatkan tampilan modal untuk tampil berbeda tergantung apa yang dipanggil untuk dilakukan (menggunakan setHidden dan setImage). dan semuanya bekerja dengan baik sebelumnya, tetapi performSelector mengabaikan hal-hal 'set', jadi pada akhirnya ini tampaknya menjadi solusi yang buruk jika Anda mencoba menjadi efisien seperti yang saya coba ...
sumber