Die neue Methode ist:
[self dismissViewControllerAnimated:NO completion:nil];
Das Wort modal wurde entfernt; Wie beim vorgestellten API-Aufruf:
[self presentViewController:vc animated:NO completion:nil];
Die Gründe wurden in der WWDC-Sitzung 236 2012 - Die Entwicklung von View Controllern auf iOS- Videos erörtert . Im Wesentlichen sind die von dieser API präsentierten View-Controller nicht mehr immer modal, und da sie einen Completion-Handler hinzugefügt haben, war es ein guter Zeitpunkt, ihn umzubenennen.
Als Antwort auf den Kommentar von Marc:
Was ist der beste Weg, um alle Geräte 4.3 und höher zu unterstützen? Die neue Methode funktioniert in iOS4 nicht, die alte Methode ist in iOS6 jedoch veraltet.
Mir ist klar, dass dies fast eine separate Frage ist, aber ich denke, es ist eine Erwähnung wert, da nicht jeder das Geld hat, alle seine Geräte alle 3 Jahre zu aktualisieren, so dass viele von uns einige ältere Geräte (vor 5.0) haben. So sehr es mich auch schmerzt, es zu sagen, müssen Sie sich überlegen, ob es sich lohnt, unter 5,0 zu zielen. Es gibt viele neue und coole APIs, die unter 5.0 nicht verfügbar sind. Und Apple macht es immer schwieriger, sie ins Visier zu nehmen. Die Unterstützung von armv6 wird beispielsweise von Xcode 4.5 gestrichen.
Um unter 5.0 zu zielen (solange der Abschlussblock Null ist), verwenden Sie einfach die handliche respondsToSelector
: Methode.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Als Antwort auf einen weiteren Kommentar von Marc:
Das könnte eine Menge If-Anweisungen in meiner Anwendung sein! ... Ich habe darüber nachgedacht, eine Kategorie zu erstellen, die diesen Code kapselt. Würde das Erstellen einer Kategorie in UIViewControler mich ablehnen?
und einer von Full Decent:
... gibt es eine Möglichkeit, manuell zu veranlassen, dass keine Compiler-Warnung angezeigt wird?
Erstens, nein, UIViewController
wenn Sie eine Kategorie an und für sich erstellen, wird Ihre App nicht abgelehnt. es sei denn, diese Kategoriemethode wird als private APIs oder ähnliches bezeichnet.
Eine Kategoriemethode ist ein außerordentlich guter Ort für solchen Code. Da die veraltete API nur einmal aufgerufen wird, gibt es nur eine Compiler-Warnung.
Um den Kommentar (Frage) von Full Decent zu beantworten, können Sie Compiler-Warnungen manuell unterdrücken. Hier ist ein Link zu einer Antwort auf SO zu diesem Thema . Eine Kategoriemethode ist auch ein großartiger Ort, um eine Compiler-Warnung zu unterdrücken, da Sie die Warnung nur an einer Stelle unterdrücken. Sie möchten den Compiler sicher nicht umsonst zum Schweigen bringen.
Wenn ich eine einfache Kategoriemethode dafür schreiben würde, könnte es ungefähr so aussehen:
@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