148 votes

Comment obtenir le contrôleur de vue racine ?

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

J'ai essayé ces approches :

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

Les retours : 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 Root.

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

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

Les retours : null :

Une idée de la raison ? Que pourrais-je essayer d'autre pour obtenir une instance de mon contrôleur de vue racine ?

Merci.

270voto

janusfidel Points 3462

Si vous essayez d'accéder au rootViewController que vous avez défini dans votre appDelegate. Essayez ceci :

Objectif-C

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

Swift

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

Swift 3

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

Swift 4 et 4.2

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

Swift 5 & 5.1 & 5.2

let viewController = UIApplication.shared.windows.first!.rootViewController as! YourViewController

49voto

chamathjeevan Points 71

Objectif-C

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

Swift 2.0

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

Swift 5

let viewController = UIApplication.shared.keyWindow?.rootViewController

11voto

esp Points 1051

Comme suggéré aquí par @0x7fffffff, si vous avez UINavigationController cela peut être plus facile à faire :

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

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

10voto

Thiên Quang Points 188

Para Swift 5 et plus je vous recommande d'utiliser cette méthode :

UIApplication.shared.windows.last?.rootViewController

Utilice .dernier retournera la vue supérieure du contrôleur actif.

.premier ne fonctionne parfois pas avec les bibliothèques qui nécessitent une fenêtre sur top & actif .

Par exemple : Admob . La publicité ne s'affiche pas et je constate que j'appelle la fenêtre cachée en dessous lorsque j'utilise sheet ou fullscreenCover.

NOTE : View veut afficher les annonces requises dans NavigationView, sinon, les annonces ne seront pas exécutées.

Exemple : NavigationView { View1() }

J'espère que cela vous sera utile.

4voto

wisty Points 4280

A moins que vous n'ayez une bonne raison, dans votre contrôleur Root, de faire cela :

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

Et quand vous voulez le notifier :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X