Il nuovo metodo è:
[self dismissViewControllerAnimated:NO completion:nil];
La parola modale è stata rimossa; Come è stato per la chiamata API di presentazione:
[self presentViewController:vc animated:NO completion:nil];
I motivi sono stati discussi nella sessione 236 del WWDC del 2012 - L'evoluzione dei controller di visualizzazione su video iOS . In sostanza, i controller di visualizzazione presentati da questa API non sono più sempre modali e poiché stavano aggiungendo un gestore di completamento, era un buon momento per rinominarlo.
In risposta al commento di Marc:
Qual è il modo migliore per supportare tutti i dispositivi 4.3 e versioni successive? Il nuovo metodo non funziona in iOS4, ma il vecchio metodo è deprecato in iOS6.
Mi rendo conto che questa è quasi una domanda a parte, ma penso che valga la pena menzionarla poiché non tutti hanno i soldi per aggiornare tutti i loro dispositivi ogni 3 anni, quindi molti di noi hanno dispositivi più vecchi (pre 5.0). Tuttavia, per quanto mi addolori dirlo, devi considerare se vale la pena puntare al di sotto di 5.0. Ci sono molte API nuove e interessanti non disponibili sotto 5.0. E Apple rende continuamente più difficile prenderli di mira; Il supporto di armv6 viene eliminato da Xcode 4.5, ad esempio.
Per puntare al di sotto di 5.0 (fintanto che il blocco di completamento è nullo) basta usare il respondsToSelector
metodo pratico :.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
In risposta a un altro commento di Marc:
Potrebbero essere molte istruzioni If nella mia applicazione! ... Stavo pensando di creare una categoria che incapsulasse questo codice, la creazione di una categoria su UIViewControler mi avrebbe fatto rifiutare?
e uno da Full Decent:
... c'è un modo per far sì che manualmente non presenti un avviso del compilatore?
In primo luogo, no, la creazione di una categoria UIViewController
in sé e per sé non farà rifiutare la tua app; a meno che quel metodo di categoria non chiami API private o qualcosa di simile.
Un metodo di categoria è un ottimo posto per tale codice. Inoltre, poiché ci sarebbe solo una chiamata all'API deprecata, ci sarebbe solo un avviso del compilatore.
Per rispondere al commento (domanda) di Full Decent, sì, puoi sopprimere manualmente gli avvisi del compilatore. Ecco un collegamento a una risposta su SO su questo argomento . Un metodo di categoria è anche un ottimo posto per sopprimere un avviso del compilatore, poiché stai sopprimendo l'avviso solo in un punto. Certamente non vuoi andare in giro a silenziare il compilatore, volenti o nolenti.
Se dovessi scrivere un semplice metodo di categoria per questo potrebbe essere qualcosa del genere:
@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