Yeni yöntem şudur:
[self dismissViewControllerAnimated:NO completion:nil];
Modal kelimesi kaldırılmıştır; Sunum API çağrısı için olduğu gibi:
[self presentViewController:vc animated:NO completion:nil];
Sebepler 2012 WWDC Oturum 236 - iOS Videoda Görüntü Denetleyicilerinin Evrimi'nde tartışıldı . Esasen, bu API tarafından sunulan görünüm denetleyicileri artık her zaman kalıcı değildir ve bir tamamlama işleyicisi ekledikleri için yeniden adlandırmak için iyi bir zamandı.
Marc'ın yorumuna yanıt olarak:
4.3 ve üzeri tüm cihazları desteklemenin en iyi yolu nedir? Yeni yöntem iOS4'te çalışmaz, ancak eski yöntem iOS6'da kullanımdan kaldırılmıştır.
Bunun neredeyse ayrı bir soru olduğunun farkındayım, ancak herkesin her 3 yılda bir tüm cihazlarını yükseltecek parası olmadığı için birçoğumuzun bazı eski (5.0 öncesi) cihazları var. Yine de bunu söylemek bana acı verse de 5.0'ın altında hedeflemeye değip değmeyeceğini düşünmelisiniz. 5.0'ın altında bulunmayan birçok yeni ve havalı API vardır. Ve Apple sürekli olarak onları hedef almayı zorlaştırıyor; armv6 desteği, örneğin Xcode 4.5'ten çıkarılır.
5.0'ın altında hedeflemek için (tamamlama bloğu sıfır olduğu sürece) kullanışlı respondsToSelector: yöntemini kullanın .
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Marc'ın başka bir yorumuna cevaben:
Bu, başvurumdaki çok fazla If ifadesi olabilir! ... Bu kodu içeren bir kategori oluşturmayı düşünüyordum, UIViewControler'da bir kategori oluşturmak reddedilmeme neden olur mu?
ve Full Decent'ten biri:
... bunun bir derleyici uyarısı göstermemesini manuel olarak sağlamanın bir yolu var mı?
İlk olarak, hayır, UIViewControllerkendi başına bir kategori oluşturmak , uygulamanızı reddedmez; bu kategori yöntemi özel API'leri veya benzer bir şeyi çağırmadıkça.
Kategori yöntemi, bu tür bir kod için son derece iyi bir yerdir. Ayrıca, kullanımdan kaldırılan API'ye yalnızca bir çağrı olacağından, yalnızca bir derleyici uyarısı olacaktır.
Full Decent'in yorumunu (soruyu) ele almak için, evet, derleyici uyarılarını manuel olarak bastırabilirsiniz. İşte tam da bu konuda SO ile ilgili bir yanıtın bağlantısı . Bir kategori yöntemi aynı zamanda bir derleyici uyarısını bastırmak için harika bir yerdir çünkü uyarıyı yalnızca tek bir yerde bastırırsınız. Kesinlikle derleyiciyi susturmak istemezsiniz.
Bunun için basit bir kategori yöntemi yazacak olsaydım, bunun gibi bir şey olabilirdi:
@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