Soweit ich weiß, würde dies in Ziel-C funktionieren:
self.window.rootViewController.class == myViewController
Wie kann ich überprüfen, ob es sich bei dem aktuellen Ansichtscontroller um einen bestimmten handelt?
Soweit ich weiß, würde dies in Ziel-C funktionieren:
self.window.rootViewController.class == myViewController
Wie kann ich überprüfen, ob es sich bei dem aktuellen Ansichtscontroller um einen bestimmten handelt?
Antworten:
Verwenden Sie zum Überprüfen der Klasse in Swift "is" (wie unter "Überprüfen des Typs" im Kapitel "Typumwandlung im Swift-Programmierhandbuch" erläutert).
if self.window.rootViewController is MyViewController {
//do something if it's an instance of that class
}
self.window
existiert nicht
self
in diesem Fall? Wo setzen Sie den Code ein? self.window und rootViewController befinden sich in AppDelegate. Benötigen Sie weitere Informationen.
Aktualisiert für den Swift3-Compiler, der einen Anfall macht! 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
}
}
self.window
benutzenself.view.window
Wenn Sie einen Navigationscontroller verwenden, können Sie problemlos über Ihre Ansichtscontroller iterieren. Und dann können Sie nach der bestimmten Instanz suchen als:
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(MenuViewController) {
println("yes it is")
}
}
}
struct
Inneres der Klasse stecke?
Ich musste den aktuellen viewController in AppDelegate finden. Ich habe das benutzt
//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!!!")
}
}
}
Versuche dies
if self is MyViewController {
}
Um von Thapas Antwort abzuweichen, 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
Swift 3
Ich bin mir nicht sicher, aber ich habe es schwer mit diesem. 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 habe immer wieder den anfänglichen View Controller meiner App erhalten. Aus irgendeinem Grund wollte es der Root-View-Controller bleiben, egal was passiert. Also habe ich einfach eine globale Variable vom Typ String erstellt currentViewController
und ihren Wert in jeder Variable selbst festgelegt viewDidLoad()
. Ich musste nur sagen, auf welchem Bildschirm ich mich befand und das funktioniert perfekt für mich.
Für Typen, die Sie verwenden können, is
und wenn es sich um Ihre eigene Viewcontroller-Klasse handelt, müssen Sie Folgendes verwenden isKindOfClass
:
let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1]
if vcOnTop.isKindOfClass(VcShowDirections){
return
}
Swift 3 | Überprüfen Sie, ob ein Ansichts-Controller der Stamm in sich selbst ist.
Sie können window
von einem View Controller aus zugreifen , den Sie nur verwenden müssen self.view.window
.
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 verwende .UIDeviceOrientationDidChange
, schauen Sie sich diese Antwort an .
let viewControllers = navController?.viewControllers
for aViewController in viewControllers! {
if aViewController .isKind(of: (MyClass?.classForCoder)!) {
_ = navController?.popToViewController(aViewController, animated: true)
}
}
Überprüfen Sie den Weg, der für mich besser funktioniert hat. Was ist .selbst
if ((self.window.rootViewController?.isKind(of: WebViewController.self))!)
{
//code
}
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)
}
Mein Vorschlag ist eine Variation von Kirans Antwort oben. Ich habe das in einem Projekt verwendet.
Swift 5
// convenience property API on my class object to provide access to the my WindowController (MyController).
var myXWindowController: MyController? {
var myWC: MyController?
for viewController in self.windowControllers {
if ((viewController as? MyController) != nil) {
myWC = viewController as? MyController
break
}
}
return myWC
}
// example of use
guard let myController = myXWindowController else {
reportAssertionFailure("Failed to get MyXController from WindowController.")
return
}
var top = window?.rootViewController
while ((top?.presentedViewController) != nil) {
top = top?.presentedViewController
}
if !(type(of: top!) === CallingVC.self) {
top?.performSegue(withIdentifier: "CallingVC", sender: call)
}