Soweit ich weiß, würde dies in Objective-C funktionieren:
self.window.rootViewController.class == myViewController
Wie kann ich überprüfen, ob der aktuelle View Controller ein bestimmter ist?
Um die Klasse in Swift zu überprüfen, verwenden Sie "ist" (wie unter "Typ prüfen" im Kapitel "Typumwandlung" im Swift-Programmierhandbuch beschrieben)
if self.window.rootViewController is MyViewController {
//do something if it's an instance of that class
}
Aktualisiert für den Swift3-Compiler, der herumzieht! und ?
if let wd = UIApplication.shared.delegate?.window {
var vc = wd!.rootViewController
if(vc is UINavigationController){
vc = (vc as! UINavigationController).visibleViewController
}
if(vc is LogInViewController){
//your code
}
}
Sie können Ihre View-Controller problemlos durchlaufen, wenn Sie einen Navigations-Controller verwenden. Und dann können Sie nach der jeweiligen Instanz suchen:
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(MenuViewController) {
println("yes it is")
}
}
}
Ich musste den aktuellen viewController in AppDelegate finden, den ich verwendet habe
//at top of class
var window:UIWindow?
// inside my method/function
if let viewControllers = window?.rootViewController?.childViewControllers {
for viewController in viewControllers {
if viewController.isKindOfClass(MyViewControllerClass) {
println("Found it!!!")
}
}
}
Um die Antwort von Thapa zu umgehen, müssen Sie in die Viewcontroller-Klasse wechseln, bevor Sie ...
if let wd = self.view.window { var vc = wd.rootViewController! if(vc is UINavigationController){ vc = (vc as! UINavigationController).visibleViewController } if(vc is customViewController){ var viewController : customViewController = vc as! customViewController
Versuche dies
if self is MyViewController {
}
Swift 3
Ich bin mir nicht sicher, was euch angeht, aber es fällt mir schwer. Ich habe so etwas gemacht:
if let window = UIApplication.shared.delegate?.window {
if var viewController = window?.rootViewController {
// handle navigation controllers
if(viewController is UINavigationController){
viewController = (viewController as! UINavigationController).visibleViewController!
}
print(viewController)
}
}
Ich bekam immer den ersten View-Controller meiner App. Aus irgendeinem Grund wollte es der Root-View-Controller bleiben, egal was. Also habe ich einfach eine globale Stringvariable currentViewController
erstellt und ihren Wert in jeder viewDidLoad()
selbst festgelegt. Alles was ich brauchte, war zu sagen, auf welchem Bildschirm ich war und das funktioniert perfekt für mich.
let viewControllers = navController?.viewControllers
for aViewController in viewControllers! {
if aViewController .isKind(of: (MyClass?.classForCoder)!) {
_ = navController?.popToViewController(aViewController, animated: true)
}
}
Swift 3 | Prüfen Sie, ob ein View-Controller das Stammverzeichnis von sich aus ist.
Sie können innerhalb eines View-Controllers auf window
zugreifen. Sie müssen lediglich self.view.window
verwenden.
Kontext: Ich muss die Position einer Ansicht aktualisieren und eine Animation auslösen, wenn das Gerät gedreht wird. Ich möchte dies nur tun, wenn der View Controller aktiv ist.
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(deviceDidRotate),
name: .UIApplicationDidChangeStatusBarOrientation,
object: nil
)
}
func deviceDidRotate() {
guard let window = self.view.window else { return }
// check if self is root view controller
if window.rootViewController == self {
print("vc is self")
}
// check if root view controller is instance of MyViewController
if window.rootViewController is MyViewController {
print("vc is MyViewController")
}
}
}
Wenn Sie Ihr Gerät drehen, während MyViewController aktiv ist, werden die obigen Zeilen auf der Konsole gedruckt. Wenn MyViewController nicht aktiv ist, werden Sie nicht angezeigt.
Wenn Sie neugierig sind, warum ich UIDeviceOrientationDidChange
anstelle von .UIDeviceOrientationDidChange
verwende, dann sehen Sie diese Antwort .
Für Typen können Sie is
verwenden. Wenn es sich um Ihre eigene Viewcontroller-Klasse handelt, müssen Sie isKindOfClass
wie folgt verwenden:
let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1]
if vcOnTop.isKindOfClass(VcShowDirections){
return
}
if let index = self.navigationController?.viewControllers.index(where: { $0 is MyViewController }) {
let vc = self.navigationController?.viewControllers[vcIndex] as! MyViewController
self.navigationController?.popToViewController(vc, animated: true)
} else {
self.navigationController?.popToRootViewController(animated: true)
}