Autant que je sache, cela fonctionnerait en Objective-C:
self.window.rootViewController.class == myViewController
Comment puis-je vérifier si le contrôleur de vue actuel est spécifique?
Pour vérifier la classe dans Swift, utilisez "est" (comme expliqué dans "Contrôle du type" dans le chapitre intitulé Transtypage dans le guide de programmation Swift)
if self.window.rootViewController is MyViewController {
//do something if it's an instance of that class
}
Mise à jour pour le compilateur Swift3 qui tente de résoudre le problème! et ?
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
}
}
Vous pouvez facilement parcourir vos contrôleurs de vue si vous utilisez un contrôleur de navigation. Et ensuite, vous pouvez vérifier l'instance particulière en tant que:
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(MenuViewController) {
println("yes it is")
}
}
}
Je devais trouver le viewController actuel dans AppDelegate . J'ai utilisé cette
//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!!!")
}
}
}
Pour sortir de la réponse de Thapa, vous devez utiliser la classe viewcontroller avant d'utiliser ...
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
Essaye ça
if self is MyViewController {
}
Swift 3
Je ne sais pas pour vous, mais je vais avoir du mal avec celui-ci. J'ai fait quelque chose comme ça:
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)
}
}
Je n'arrêtais pas d'obtenir le contrôleur de vue initial de mon application. Pour une raison quelconque, il souhaitait rester le contrôleur de vue racine, quoi qu'il arrive. Je viens donc de créer une variable de type chaîne globale currentViewController
et de définir moi-même sa valeur dans chaque viewDidLoad()
. Tout ce dont j'avais besoin était de dire sur quel écran j'étais et cela fonctionnait parfaitement pour moi.
let viewControllers = navController?.viewControllers
for aViewController in viewControllers! {
if aViewController .isKind(of: (MyClass?.classForCoder)!) {
_ = navController?.popToViewController(aViewController, animated: true)
}
}
Swift 3 | Vérifiez si un contrôleur de vue est la racine à partir de lui-même.
Vous pouvez accéder à window
à partir d'un contrôleur de vue, il vous suffit d'utiliser self.view.window
.
Contexte: Je dois mettre à jour la position d'une vue et déclencher une animation lors de la rotation du périphérique. Je veux seulement faire ceci si le contrôleur de vue est actif.
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")
}
}
}
Si vous faites pivoter votre appareil alors que MyViewController est actif, les lignes ci-dessus s'afficheront sur la console. Si MyViewController n'est pas actif, vous ne les verrez pas.
Si vous êtes curieux de savoir pourquoi j'utilise UIDeviceOrientationDidChange
au lieu de .UIDeviceOrientationDidChange
, regardez cette réponse .
Pour les types, vous pouvez utiliser is
et s'il s'agit de votre propre classe viewcontroller, vous devez utiliser isKindOfClass
comme:
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)
}