Ich kann nicht scheinen, die Spitze am meisten UIViewController
ohne Zugang zu einem zu bekommen UINavigationController
. Folgendes habe ich bisher:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
Es scheint jedoch nichts zu tun. Die keyWindow
und rootViewController
scheinen ebenfalls keine Werte zu sein, daher sollte die optionale Verkettung kein Problem darstellen.
HINWEIS: Es ist eine schlechte Idee, so etwas zu tun. Es bricht das MVC-Muster.
swift
uiviewcontroller
Zoyt
quelle
quelle
Antworten:
presentViewController
zeigt einen View Controller. Es wird kein View Controller zurückgegeben. Wenn Sie a nicht verwendenUINavigationController
, suchen Sie wahrscheinlich nachpresentedViewController
und müssen am Stamm beginnen und die dargestellten Ansichten durchlaufen.Für Swift 3+:
Für iOS 13+
quelle
topController.presentedViewController
etwas zurückgegeben wird (dh der Controller hat einen vorgestellten untergeordneten Controller). Es gehtwhile let
darum, die Tatsache durchzusetzen, dasstopController.presentedViewController
etwas zurückgegeben werden muss. Wenn null zurückgegeben wird (dh der Controller hat keine untergeordneten untergeordneten Elemente), wird die Schleife beendet. Im Hauptteil der Schleife wird das untergeordnete Element als Strom neu zugewiesentopController
und die Schleife erneut durchlaufen, wobei die Hierarchie des Ansichtscontrollers heruntergefahren wird. Es kann neu zugewiesen werden,topController
wie esvar
in der äußerenif
Anweisung steht.while let
. Es gibt natürlich vieleif let
Beispiele.let x = somethingThatCouldBeNil
Syntax ist ein sehr praktischer Trick, um überall dort zu verwenden, wo ein Wahrheitswert / eine Wahrheitsbedingung verwendet werden kann. Wenn wir es hier nicht verwenden würden, müssten wir explizit einen Wert zuweisen und dann testen, ob er tatsächlich vorhanden ist. Ich denke, es ist wirklich prägnant und ausdrucksstark.habe diese Erweiterung
Swift 2. *
Swift 3
Sie können dies überall auf Ihrem Controller verwenden
quelle
return
). Wie kann es in eine Endlosschleife kommen?Für schnelles 4/5 +, um den obersten ViewController zu erhalten
Wie benutzt man
quelle
Verwendung:
quelle
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
.presentedViewController.presentedViewController
oder nicht?Basierend auf der Antwort von Dianz, der Objective-C-Version
quelle
ich liebte die Antwort von @ dianz , und hier ist die Version von Swift 3. Es ist im Grunde das Gleiche, aber ihm fehlte eine geschweifte Klammer und einige der Syntax- / Variablen- / Methodennamen haben sich geändert. Hier ist es also!
Die Verwendung ist jedoch immer noch genau die gleiche:
quelle
https://gist.github.com/db0company/369bfa43cb84b145dfd8 Ich habe einige Tests zu den Antworten und Kommentaren auf dieser Site durchgeführt. Für mich funktioniert folgendes
Holen Sie sich dann den Top ViewController von:
quelle
Verwenden Sie diesen Code, um den besten UIViewController zu finden
quelle
Leichte Variation von @AlberZou unter Verwendung einer berechneten Variablen anstelle einer Funktion
Dann sage
quelle
Basierend auf Bob-c oben:
Swift 3.0
quelle
Zu viele Geschmacksrichtungen, aber keine iterativ ausgearbeitete. Kombiniert von den vorherigen:
quelle
Sie können eine UIViewController-Variable in AppDelegate definieren und in jeder viewWillAppear die Variable auf self setzen (jedoch ist die Dianz-Antwort die beste Antwort.)
quelle
So finden Sie den sichtbaren viewController in Swift 3
Dieser Code findet den zuletzt hinzugefügten oder den zuletzt aktiven Controller sichtbar.
Dies habe ich in AppDelegate verwendet, um Active View Controller zu finden
quelle
quelle
Wo haben Sie den Code eingegeben?
Ich versuche Ihren Code in meiner Demo, ich habe herausgefunden, ob Sie den Code eingeben
wird fehlschlagen, da das Schlüsselfenster noch eingestellt wurde.
Aber ich habe Ihren Code in einige View-Controller eingefügt
Es funktioniert einfach.
quelle
didFinishLaunchingWithOptions
. Ich brauche dies nur für verschiedene Debug-Zwecke.In einem sehr seltenen Fall mit benutzerdefiniertem Übergang befindet sich der oberste Ansichts-Controller nicht in einem Navigationsstapel oder einem Registerkarten-Controller oder wird angezeigt, sondern seine Ansicht wird oben in den Unteransichten des Schlüsselfensters eingefügt.
In einer solchen Situation muss überprüft werden
UIApplication.shared.keyWindow.subviews.last == self.view
, ob der aktuelle Ansichts-Controller der oberste ist.quelle
Für alle, die eine schnelle 5 / iOS 13+ Lösung suchen (
keywindow
ist seit iOS 13 veraltet)quelle
quelle
Die beste Lösung für mich ist eine Erweiterung mit einer Funktion. Erstellen Sie eine schnelle Datei mit dieser Erweiterung
Erstens ist die UIWindow-Erweiterung :
innerhalb dieser Datei Add-Funktion
Und wenn Sie es verwenden möchten, können Sie es überall aufrufen. Beispiel :
Der Dateicode lautet wie folgt :
quelle