Necesito una instancia de raíz de controlador de vista.

Traté de esos enfoques:

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

Devuelve: null:

También cuando intento obtener un conjunto de controladores:

NSArray *viewControllers = self.navigationController.viewControllers;

Devuelve sólo un controlador, pero no es mi raíz controlador de vista.

Si trato de tomar de la navegación de controlador:

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

Devuelve: null:

Cualquier idea por qué? ¿Qué otra cosa podría tratar de obtener una instancia de mi raíz controlador de vista?

Gracias.

  • El keyWindow es la ventana activa,por ejemplo,al mostrar un UIAlertView,el UIAlertView de la ventana es el keyWindow pero no es el AppDelegate de la ventana.Si usted desea obtener de la aplicación de rootViewController,tal vez de usar [[[UIApplication sharedApplication] delegado] de la ventana] rootViewController ] es mejor.
InformationsquelleAutor Streetboy | 2012-09-14

9 Comentarios

  1. 165

    si usted está tratando de acceder a la rootViewController establece en su appDelegate. intente esto:

    Objective-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 & 4.2

    let viewController = UIApplication.shared.keyWindow!.rootViewController as! YourViewController
    • YourViewController *rootController =(YourViewController *)[[(YourAppDelegate *) [[UIApplication sharedApplication]delegado] de la ventana] rootViewController];
    • En Swift2, tienes que usar «vamos a appDelegate = UIApplication.sharedApplication().delegado como! AppDelegate», a fuerza de manta
    • Hay alguna forma de tener dos controladores asignados de esta manera para que usted pueda obtener datos de ambos para el reloj?
    • Este es un salvavidas. Gracias! Me tomó meses para encontrar esta pieza de deliciosos código!
  2. 34

    En breve de la mano camino de acceso raíz de controlador de vista.

    Objetivo C

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

    Swift 2.0

    let viewController =  UIApplication.sharedApplication().keyWindow?.rootViewController
    • Esta debe ser la respuesta. +1 Las otras respuestas no funcionará si usted necesita para hacer referencia a la raíz de controlador de vista de un marco diferente que su principal aplicación es dependiente.
  3. 16

    Objective-C formato :

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

    Swift 2 formato :

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

    Swift 3 y 4 formato :

    let objViewController =  UIApplication.shared.keyWindow?.rootViewController
  4. 10

    Como se sugiere aquí por @0x7fffffff, si usted tiene UINavigationController puede ser más fácil de hacer:

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

    El código de la respuesta anterior devuelve UINavigation controlador (si la tiene) y si esto es lo que usted necesita, usted puede utilizar self.navigationController.

  5. 5

    A menos que usted tenga una buena razón, en su raíz controlador de hacer esto:

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

    Y cuando desea notificar:

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

    Forma rápida para hacerlo, usted puede llamar desde cualquier lugar, devuelve opcional así que ten cuidado acerca de que:

    ///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
    }

    Incluido como una función estándar en:

    https://github.com/goktugyil/EZSwiftExtensions

  7. 1

    Swift 3: Chage ViewController sin Segue y enviar AnyObject
    Uso: Identidad MainPageViewController en destino ViewController

    let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController
    
    var mainPageNav = UINavigationController(rootViewController: mainPage)
    
    self.present(mainPageNav, animated: true, completion: nil)

    o si desea Cambiar la Vista Controlador y enviar Datos

    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)  
    • Eres el mejor tio 🙂
  8. 0
    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)
    • Bienvenido a ASÍ. Esta pregunta ya tiene una gran upvoted, aceptado (y posteriormente actualizado) respuesta. Tu post no responder a la pregunta planteada. Por favor, consulte stackoverflow.com/help/how-to-answer.

Dejar respuesta

Please enter your comment!
Please enter your name here