web-dev-qa-db-fra.com

Comment obtenir le contrôleur de vue racine?

J'ai besoin d'une instance de contrôleur de vue racine.

J'ai essayé ces approches:

UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];

Retourne: null:

Aussi, lorsque j'essaie d'obtenir un tableau de contrôleurs:

NSArray *viewControllers = self.navigationController.viewControllers;

Il ne renvoie qu'un seul contrôleur, mais ce n'est pas mon contrôleur de vue racine.

Si j'essaie de prendre du contrôleur de navigation:

UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];

Retourne: null:

Des idées pourquoi? Que puis-je essayer d'obtenir une instance de mon contrôleur de vue racine?

Merci.

95
Streetboy

si vous essayez d'accéder au rootViewController que vous avez défini dans votre appDelegate. essaye ça:

Objective-C

YourViewController *rootController = (YourViewController*)[[(YourAppDelegate*)
                                   [[UIApplication sharedApplication]delegate] window] rootViewController];

rapide

let appDelegate  = UIApplication.sharedApplication().delegate as AppDelegate
let viewController = appDelegate.window!.rootViewController as YourViewController

Swift

let appDelegate  = UIApplication.shared.delegate as! AppDelegate
let viewController = appDelegate.window!.rootViewController as! YourViewController

Swift 4 & 4.2

let viewController = UIApplication.shared.keyWindow!.rootViewController as! YourViewController
169
janusfidel

En bref chemin d'accès contrôleur de vue racine.

Objectif C

UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;

Swift 2.

let viewController =  UIApplication.sharedApplication().keyWindow?.rootViewController
34
Chamath Jeevan

format Objective-C:

UIViewController *objViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

format Swift 2:

let objViewController =  UIApplication.sharedApplication().keyWindow?.rootViewController

format Swift 3 et 4:

let objViewController =  UIApplication.shared.keyWindow?.rootViewController
16
Jayprakash Dubey

Comme suggéré ici par @ 0x7fffffff, si vous avez UINavigationController, cela peut être plus simple:

YourViewController *rootController =
    (YourViewController *)
        [self.navigationController.viewControllers objectAtIndex: 0];

Le code dans la réponse ci-dessus renvoie le contrôleur UINavigation (si vous en avez un) et si c'est ce dont vous avez besoin, vous pouvez utiliser self.navigationController.

10
esp

À moins que vous n'ayez une bonne raison, procédez comme suit dans votre contrôleur racine:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onTheEvent:)
                                             name:@"ABCMyEvent"
                                           object:nil];

Et quand vous voulez le notifier:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
                                                object:self];                
5
wisty

Swift

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

1
cybermach

Manière rapide de le faire, vous pouvez appeler cela de n'importe où, il retourne optionnel alors faites attention à cela:

/// EZSwiftExtensions - Gives you the VC on top so you can easily Push your popups
var topMostVC: UIViewController? {
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while let pVC = presentedVC?.presentedViewController {
        presentedVC = pVC
    }

    if presentedVC == nil {
        print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
    }
    return presentedVC
}

Son inclus en tant que fonction standard dans:

https://github.com/goktugyil/EZSwiftExtensions

1
Esqarrouth

Swift 3: Chage ViewController withOut Segue et envoi de AnyObject Utilisation: Identity MainPageViewController sur ViewController cible

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)

ou si vous voulez changer le contrôleur de vue et envoyer des données

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

let dataToSend = "**Any String**" or  var ObjectToSend:**AnyObject** 

mainPage.getData = dataToSend 

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)  
1
user6857463
let view:UIView = UIView()

view.frame = CGRect(x:0, y:0, width:UIApplication.shared.statusBarFrame.width, height:UIApplication.shared.statusBarFrame.height

view.backgroundColor = UIColor.init(named: "yourColor")
UIApplication.shared.keyWindow!.rootViewController?.view.addSubview(view)
0
Alam