Wie kann ich in meinem View Controller-Code unterscheiden zwischen:
- modal präsentiert
- auf Navigationsstapel geschoben
Beide presentingViewController
und isMovingToParentViewController
sind YES
in beiden Fällen also nicht sehr hilfreich.
Was die Sache kompliziert macht, ist, dass mein übergeordneter Ansichts-Controller manchmal modal ist, auf den der zu überprüfende Ansichts-Controller gedrückt wird.
Es stellt sich heraus, dass mein Problem darin besteht, dass ich meine HtmlViewController
in eine einbettete, UINavigationController
die dann vorgestellt wird. Deshalb haben meine eigenen Versuche und die guten Antworten unten nicht funktioniert.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Ich denke, ich sollte meinem View Controller besser sagen, wann er modal ist, anstatt zu versuchen, ihn zu bestimmen.
quelle
presentingViewController
ist immerYES
in meinem Fall; hilft nicht.presentingViewController
GibtYES
für Push-VC zurück, wenn einUITabBarController
Wesen als Root festgelegt ist. Also in meinem Fall nicht geeignet.In Swift :
Fügen Sie ein Flag hinzu, um zu testen, ob es sich um ein Modal des Klassentyps handelt:
quelle
var isModal: Bool {}
false
Parameter in derreturn
Anweisung?Sie haben eine Methode übersehen :
isBeingPresented
.isBeingPresented
ist wahr, wenn der Ansichts-Controller angezeigt wird, und falsch, wenn er gedrückt wird.quelle
isBeingPresented
istNO
. Aber ich sehe jetzt den Grund, warum ich meinen vorgestellten View Controller in a einbetteUINavigationController
, und das ist der, den ich dränge.p
, nichtpo
beim Drucken eines primitiven Werts.po
dient zum Drucken von Objekten.isBeingPresented
- Diese Methode gibt nur dann JA zurück, wenn sie aus den Methoden viewWillAppear: und viewDidAppear: aufgerufen wird.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
undisMovingToParentViewController
sind nur gültig , innerhalb der 4 -view[Will|Did][Disa|A]ppear
Methoden.Swift 5
Hier ist eine Lösung, die das mit früheren Antworten erwähnte Problem behebt, wenn sich die
isModal()
Rückgabetrue
bei PushUIViewController
in einem präsentiertenUINavigationController
Stapel befindet.Bisher funktioniert es bei mir. Wenn einige Optimierungen vorliegen, teilen Sie diese bitte mit.
quelle
tabBarController?.presentingViewController is UITabBarController
? Ist es wichtig, ob daspresentingViewController
auch ein UITabBarController ist?isModal
wird zurückgegebentrue
. Ist das beabsichtigt?Um den Fall zu behandeln, dass der aktuelle Ansichtscontroller gedrückt wird, während der Navigationscontroller modal dargestellt wird, habe ich einige Codezeilen hinzugefügt, um zu überprüfen, ob der aktuelle Ansichtscontroller der Root-Controller im Navigationsstapel ist.
quelle
Swift 4
quelle
Swift 5. Sauber und einfach.
quelle
Wie viele Leute hier vorschlagen, dass "Überprüfungsmethoden" nicht in allen Fällen gut funktionieren, habe ich in meinem Projekt eine Lösung gefunden, um dies manuell zu verwalten. Der Punkt ist, dass wir die Präsentation normalerweise selbst verwalten - dies geschieht nicht hinter den Kulissen und wir müssen nach innen schauen.
DEViewController.h
Datei:Die Präsentationen können jetzt folgendermaßen verwaltet werden:
auf Navigationsstapel geschoben:
Modal mit Navigation dargestellt:
modal präsentiert:
Außerdem
DEViewController
könnten wir der "Überprüfung" einen Fallback hinzufügen, wenn die oben genannte Eigenschaft gleich istSSViewControllerPresentationMethodUnspecified
:quelle
Angenommen, alle ViewController, die Sie modal präsentieren, sind in einem neuen Navigationscontroller verpackt (was Sie sowieso immer tun sollten), können Sie diese Eigenschaft Ihrem VC hinzufügen.
quelle
Um zu erkennen, dass Ihr Controller gedrückt wird oder nicht, verwenden Sie den folgenden Code an einer beliebigen Stelle:
Ich hoffe, dieser Code kann jedem helfen ...
quelle
self.navigationController != nil
würde bedeuten, dass es in einem Navigationsstapel ist.quelle
quelle
Wenn Sie ios 5.0 oder höher verwenden, verwenden Sie bitte diesen Code
quelle
Swift 5
Diese praktische Erweiterung behandelt nur wenige Fälle mehr als frühere Antworten. Diese Fälle sind VC (View Controller) ist die Stamm-VC des App-Fensters, VC wird als untergeordnete VC zur übergeordneten VC hinzugefügt. Es wird nur dann versucht, true zurückzugeben, wenn der Viewcontroller modal dargestellt wird.
Dank Jonauz 'Antwort . Auch hier ist Platz für weitere Optimierungen. Bitte besprechen Sie den Fall, der behandelt werden muss, im Kommentarbereich.
quelle
Für jemanden, der sich fragt, wie man ViewController mitteilt, dass es präsentiert wird
wenn
A
präsentiert / drücktB
Definieren Sie ein
enum
undproperty
inB
Überprüfen Sie nun im
A
Ansichts-Controller,B
ob er durch Zuweisen angezeigt / verschoben wirdpresentationStyle
Verwendung in
B
View Controllerquelle
Dadurch erfahren Sie, ob viewController angezeigt oder gepusht wird
quelle