Ist es möglich, innerhalb der ViewController-Klasse zu überprüfen, ob sie als modaler View Controller dargestellt wird?
iphone
ios
view
controller
modal-dialog
lukewar
quelle
quelle
nil == nil
zurückgegebenYES
wird und es nicht das gewünschte Ergebnis ist.Wenn Sie nach iOS 6+ suchen, ist diese Antwort veraltet und Sie sollten die Antwort von Gabriele Petronella überprüfen
Es gibt keine gute Möglichkeit, dies als Eigenschaft oder Methode von UIKit zu tun. Sie können verschiedene Aspekte Ihres Controllers überprüfen, um sicherzustellen, dass er als modal dargestellt wird.
Um zu überprüfen, ob der aktuelle
self
Controller (wie im folgenden Code dargestellt) modal dargestellt wird oder nicht, habe ich den folgenden Balken entweder in einerUIViewController
Kategorie oder (wenn Ihr Projekt keine anderen UIKit-Controller verwenden muss, alsUITableViewController
zum Beispiel) in einem Basis-Controller, von dem meine anderen Controller erbenBEARBEITEN: Ich habe die letzte Überprüfung hinzugefügt, um festzustellen, ob ein UITabBarController verwendet wird, und Sie präsentieren einen anderen UITabBarController als modal.
BEARBEITEN 2: iOS 5+ Check hinzugefügt, wo
UIViewController
nichtparentViewController
mehr geantwortet wird, sondernpresentingViewController
stattdessen.EDIT 3: Ich habe einen Kern dafür erstellt, nur für den Fall, dass https://gist.github.com/3174081
quelle
modalViewController
Eigenschaft ab iOS 6 veraltet ist. In der Dokumentation wird empfohlen, siepresentedViewController
stattdessen zu verwenden .NSLog(@"%@", self.navigationController.parentViewController)
Drucke(null)
- können Sie bitte erklären, warum? Mein ViewController ist über navController im Storyboard mit dem Modal View Controller verbunden..parentViewController
ist veraltet,.presentingViewController
muss stattdessen verwendet werden.In iOS5 + können Sie es, wie Sie in der UIViewController-Klassenreferenz sehen können, über die Eigenschaft "PresentingViewController" abrufen .
PresentingViewController Der View-Controller, der diesen View-Controller präsentiert hat. (schreibgeschützt)
@property (nichtatomar, schreibgeschützt) UIViewController * Präsentation der ViewController-
Diskussion
Wenn der Ansichtscontroller, der diese Nachricht empfangen hat, von einem anderen Ansichtscontroller angezeigt wird, enthält diese Eigenschaft den Ansichtscontroller, der sie anzeigt. Wenn der Ansichtscontroller nicht angezeigt wird, aber einer seiner Vorfahren angezeigt wird, enthält diese Eigenschaft den Ansichtscontroller, der den nächsten Vorfahren darstellt. Wenn weder der Ansichtscontroller noch einer seiner Vorfahren angezeigt wird, ist diese Eigenschaft gleich Null.
Verfügbarkeit
Verfügbar in iOS 5.0 und höher.
In
UIViewController.h deklariert
quelle
presentingViewController
. Es funktioniert auch in Containersicht-Controllern, da es automatisch die Vorfahren durchläuft.Ist dies nicht der Fall , können Sie eine Eigenschaft für this (
presentedAsModal
) in Ihrer UIViewController-Unterklasse definieren und festlegen,YES
bevor Sie den ViewController als modale Ansicht präsentieren.Sie können diesen Wert in Ihrer
viewWillAppear
Überschreibung überprüfen .Ich glaube, es gibt keine offizielle Eigenschaft, die angibt, wie die Ansicht dargestellt wird, aber nichts hindert Sie daran, Ihre eigene zu erstellen.
quelle
UINavigationController
als modal präsentieren ... es sei denn, Sie erstellen einen benutzerdefinierten Navigationscontroller, um diese Eigenschaft hinzuzufügen. Und danach müssen Sie innerhalb der Controllerself.navigationController
jedes Mal, wenn Sie überprüfen müssen, ob der Controller als modal dargestellt wird, in diese benutzerdefinierte KlassePetronellas Antwort funktioniert nicht, wenn self.navigationController modal dargestellt wird, aber self nicht gleich self.navigationController.viewControllers [0] ist. In diesem Fall wird self gedrückt.
Hier erfahren Sie, wie Sie das Problem beheben können.
Und in Swift:
quelle
Das sollte funktionieren.
quelle
UINavigationController
undUITabBarController
Fällen zu suchen . Es funktioniert bisher ziemlich gutBeste Weg zu überprüfen
quelle
Wenn Sie nicht zwischen modalen Vollbildansichten und nicht modalen Ansichten unterscheiden müssen, was in meinem Projekt der Fall ist (ich hatte ein Problem, das nur bei Formularblättern und Seitenblättern auftritt), können Sie den modalPresentationStyle verwenden Eigentum von UIViewController:
quelle
In Swift :
quelle
In meinem Projekt habe ich einen Ansichts-Controller (Detail), der entweder modal (beim Hinzufügen eines neuen Elements) oder per Push (beim Bearbeiten eines vorhandenen Elements) vom Master-Ansichts-Controller dargestellt werden kann. Wenn der Benutzer auf [Fertig] tippt, ruft der Detailansichts-Controller die Methode des Master-Ansichts-Controllers auf, um zu benachrichtigen, dass er zum Schließen bereit ist. Der Master muss festlegen, wie das Detail dargestellt wird, um zu wissen, wie es geschlossen werden kann. So mache ich das:
quelle
Ein Hack wie dieser könnte funktionieren.
Ich denke jedoch, dass meine vorherige Antwort eine sauberere Lösung ist.
quelle
Was für mich funktioniert hat, ist Folgendes:
Soweit ich es getestet habe, funktioniert dies für iOS7 und iOS8. Ich habe iOS6 jedoch nicht ausprobiert.
quelle
Ich habe mich ein bisschen umgesehen, um die richtige Antwort auf diese Frage zu finden, und ich konnte keine finden, die alle möglichen Szenarien abdeckte. Ich habe diese wenigen Codezeilen geschrieben, die den Job zu erledigen scheinen. Sie können einige Inline-Kommentare finden, um herauszufinden, was überprüft wurde.
Ich hoffe das hilft.
quelle
Hier ist meine modifizierte Version von @ GabrielePetronella
isModal
, die mit enthaltenen View-Controllern funktioniert, indem sie zuerst die parentViewController-Hierarchie aufruft. Ziehen Sie den Code auch in mehrere Zeilen heraus, damit klar ist, was er tut.quelle