Se espera que las aplicaciones tengan un controlador de vista raíz al final del lanzamiento de la aplicación

Recibo el siguiente error en mi consola:

Se espera que las aplicaciones tengan un controlador de vista raíz al final del lanzamiento de la aplicación

Debajo está mi application:didFinishLaunchWithOptions método application:didFinishLaunchWithOptions :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Set Background Color/Pattern self.window.backgroundColor = [UIColor blackColor]; self.tabBarController.tabBar.backgroundColor = [UIColor clearColor]; //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]]; // Set StatusBar Color [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent]; // Add the tab bar controller's current view as a subview of the window self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible]; return YES; } 

En Interface Builder, el delegado de UITabBarController está conectado al delegado de la aplicación.

Alguien sabe cómo solucionar este problema?

Yo tuve el mísmo problema. Compruebe su main.m. El último argumento debe establecerse en el nombre de la clase que implementa el protocolo UIApplicationDelegate.

 retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 

Reemplazar en AppDelegate

  [window addSubview:[someController view]]; 

a

  [self.window setRootViewController:someController]; 

Tuve el mismo error al intentar cambiar el primer controlador de vista que se cargó en

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Al principio no sabía realmente de dónde venía el error precisamente, así que lo reduje y descubrí qué salió mal. Resulta que estaba tratando de cambiar la visualización de una vista antes de que realmente apareciera en la pantalla. La solución fue, por lo tanto, mover este código en el controlador de vista que me estaba dando problemas de

- (void)viewDidLoad

a

- (void)viewDidAppear:(BOOL)animated

y el error dejó de aparecer. Mi problema específicamente fue causado por hacer una demostración de UIAlertView .

En su caso, le sugiero que revise el código en el controlador de vista activo de tabBarController (ya que probablemente sea un problema en ese controlador de vista). Si eso no funciona, intente establecer la configuración de inicio en el archivo nib en lugar de en el código, o si desea hacerlo en código, intente mover el código al método apropiado del control de vista del tabBarController.

¡Buena suerte!

Esto me pasó a mí. Resuelto editando el archivo .plist. Especifique el nombre base del archivo Nib principal. (Debe ser MainWindow.xib). Espero que esto ayude

enter image description here

Lo obtuve al comenzar con la plantilla “Vaciar aplicación” y luego agregar manualmente un XIB. Lo resolví estableciendo el nombre principal de Nib tal como lo sugirió Sunny. El paso que falta en este escenario es eliminar

 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

de

 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

Como sobrescribirá la instancia de su ventana creada en el archivo Xib. Esto supone que ha creado un ViewController y lo conectó con su ventana y delegado de aplicación en el archivo XIB también.

Me encontré con el mismo problema recientemente, al construir un proyecto con ios5 SDK. Al principio se estaba construyendo y funcionando correctamente, pero luego apareció el error.
En mi caso, la solución fue bastante simple.
Lo que faltaba, era que de alguna manera la propiedad Interfaz principal en la pestaña de resumen de mi objective de la aplicación se borrara. Así que tuve que configurarlo de nuevo.

Si este no es el punto, y si tabBarController aún es nulo, siempre puedes crear programáticamente tu ventana y tu controlador raíz. Como una alternativa agregué el siguiente código a mi proyecto

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (!window && !navigationController) { NSLog(@"Window and navigation controller not loaded from nib. Will be created progtwigtically."); self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; UIViewController *viewController1, *viewController2; viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease]; viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease]; self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil]; self.window.rootViewController = self.tabBarController; } else { [window addSubview:[tabBarController view]]; } [self.window makeKeyAndVisible]; return YES; } 

Esto funcionará solo si también se implementa la solución de sho.

Me actualicé a iOS9 y comencé a obtener este error de la nada. Pude solucionarlo, pero agregué el siguiente código a la aplicación - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 NSArray *windows = [[UIApplication sharedApplication] windows]; for(UIWindow *window in windows) { if(window.rootViewController == nil){ UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil]; window.rootViewController = vc; } } 

Ninguna de las sugerencias anteriores resolvió mi problema. El mío fue esto:

Añadir:

 window.rootViewController = navigationController; 

después:

 [window addSubview:navigationController.view]; 

en mi appdelegate’s

 - (void)applicationDidFinishLaunching:(UIApplication *)application { 
  • Seleccione su “Ventana” en su Archivo de Nib
  • En “Inspector de atributos”, marque “Visible al iniciar”

¡imagen![]

  • Esto sucede cuando su archivo de punta se crea manualmente.
  • Esta solución funciona para el modo de punta regular – no el modo de guión gráfico

cómo agregar un RootViewController para iOS5

si su aplicación no usó un RootViewController hasta ahora, simplemente cree uno;) presionando Archivo> Nuevo> Nuevo archivo; seleccione la UIViewController subclass UIViewController , asígnele el nombre RootViewController , desmarque la opción Con XIB para la interfaz de usuario (suponiendo que ya tenga una) y coloque este código en su AppDelegate :: didFinishLaunchingWithOptions

 rootViewController = [[RootViewController alloc] init]; window.rootViewController = rootViewController; 

seguro – tienes que importar RootViewController.h y crear la variable

aquí hay un buen artículo sobre RootViewController y AppDelegate,

También tuve este error, pero a diferencia de cualquiera de las respuestas previamente mencionadas, la mía se debía a que había descomentado el método ‘loadView’ en mi controlador recién generado (xcode 4.2, ios5).

  //Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } 

Incluso me dijo que el método era para crear la vista mediante progtwigción, pero me lo perdí porque parecía tan similar a otros métodos como viewDidLoad que normalmente uso, no lo atrapé.

Para resolver, simplemente elimine ese método si no está creando programáticamente la jerarquía de vistas, también conocido como uso de punta o guión gráfico.

También tengo este problema. Tengo mi proyecto ejecutándose en xcode4.2.1. He leído todos los comentarios allí, pero nadie es genial para mí. después de un tiempo, encuentro que comenté un fragmento de código.

 //self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

entonces lo comenté. todo está bien para mí Espero que esto sea útil para ustedes.

Asegúrese de tener esta función en su delegado de la aplicación.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { return YES; } 

Asegúrese de que didFinishLaunchingWithOptions devuelva SÍ. Si eliminó la línea ‘devolver SÍ’, esto causará el error. Este error puede ser especialmente común entre los usuarios del guión gráfico.

Hubo un ligero cambio en iOS 5.0 o más, lo que requiere que tenga un controlador de vista raíz. Si su código se basa en código de ejemplo anterior, como GLES2Sample , entonces no se creó ningún controlador de vista raíz en esos ejemplos de código.

Para corregirlo (esa GLES2Sample, por ejemplo), justo en applicationDidFinishLaunching , creo un controlador de vista raíz y adjunto mi glView a él.

 - (void) applicationDidFinishLaunching:(UIApplication *)application { // To make the 'Application windows are expected // to have a root view controller // at the end of application launch' warning go away, // you should have a rootviewcontroller, // but this app doesn't have one at all. window.rootViewController = [[UIViewController alloc] init]; // MAKE ONE window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS } 

Eso hace que la advertencia desaparezca, y de hecho no afecta tu aplicación.

Intente conectar IBOutlet del controlador de la barra de tabs a la vista raíz en el Creador de interfaces en lugar de

 self.window.rootViewController = self.tabBarController; 

Pero en realidad no he visto ese error antes.

Con mi primera vista como MenuViewController , agregué:

 MenuViewController *menuViewController = [[MenuViewController alloc]init]; self.window.rootViewController = menuViewController; 

en el método delegado de la aplicación:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { } 

Eso funciono.

Resolví el problema haciendo lo siguiente (ninguna de las otras soluciones anteriores me ayudó):

Desde el menú desplegable asociado a “Interfaz principal”, seleccione otra entrada y luego vuelva a seleccionar “Ventana principal” y vuelva a generarla.

enter image description here

Me encontré con el mismo problema pero estaba usando storyboard

Asignar mi storyboard InitialViewController al InitialViewController de mi ventana.

En

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ ... UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil]; self.window.rootViewController = [stb instantiateInitialViewController]; return YES; } 

y esto resolvió el problema

Empecé a tener este mismo problema justo después de actualizar a Xcode 4.3, y solo cuando comencé un proyecto desde cero (es decir, creo un proyecto vacío, luego creo un UIViewController y luego creo un archivo nib separado).

Después de poner TODAS las líneas que solía, y asegurarme de que tenía las conexiones correctas, seguí recibiendo ese error, y el archivo de puntaje que estaba tratando de cargar a través del controlador de vista (que se estableció como el controlador raíz) nunca se mostró en el simulador.

¡Creé una plantilla de vista única a través de Xcode y la comparé con mi código y FINALMENTE encontré el problema!

Xcode 4.3 parece agregar de manera predeterminada el método – (vacío) loadView; para ver la sección de implementación del controlador. Después de leer detenidamente los comentarios que contiene, quedó claro cuál era el problema. El comentario indicado para anular el método loadView si se crea una vista mediante progtwigción (y estoy parafraseando); de lo contrario, no se anularía loadView si se usa un plumín. No había nada más dentro de este método, así que, en efecto, estaba anulando el método (y no haciendo nada) MIENTRAS usaba un archivo de punta, que me dio el error.

La SOLUCIÓN consistía en eliminar por completo el método loadView de la sección de implementación o en llamar al método principal añadiendo [super loadView].

Eliminarlo sería mejor si se utiliza un archivo NIB, ya que agregar cualquier otro código lo anulará.

Tenía este mismo mensaje de error en el registro. Tenía una ventana emergente de UIAlertView en la aplicación: didFinishLaunchingWithOptions. Lo resolví retrasando la llamada al alertView para dar tiempo a que el controlador de la vista raíz termine de cargarse.

En aplicación: didFinishLaunchingWithOptions:

 [self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0]; 

que llama después de 1 segundo:

 - (void)callPopUp { // call UIAlertView } 

Yo tuve el mismo problema. Si está comstackndo una aplicación basada en la ventana “desde cero” como yo, debe hacer lo siguiente: (tenga en cuenta que estos son los pasos para Xcode 4.2).

0. Asegúrese de que el delegado de su aplicación cumpla con el protocolo UIApplicationDelegate.

Por ejemplo, supongamos que nuestro delegado se llama MyAppDelegate. En MyAppDelegate.h, deberíamos tener algo como esto:

 @interface MyAppDelegate : NSObject  // etc... 

1. Especifique el delegado de la aplicación en main.m

Por ejemplo,

 #import "MyAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class])); } } 

2. Cree un archivo de interfaz de ventana principal.

Para hacer esto, haga clic derecho en su proyecto y elija Nuevo archivo. Desde allí, elija Ventana en la sección iOS -> Interfaz de usuario.

Después de agregar el archivo a su proyecto, vaya al resumen del proyecto (haga clic izquierdo en el proyecto, haga clic en Resumen) en Información de implementación de iPhone / iPod (y la sección correspondiente de iPad si lo desea) y seleccione su nuevo archivo de interfaz en el ” Interfaz principal “cuadro combinado.

3. Enganche todo en el editor de interfaz

Seleccione su archivo de interfaz en la lista de archivos para abrir el editor de interfaz.

Asegúrese de que el panel de Utilidades esté abierto.

Agregue un nuevo Objeto arrastrando un Objeto de la lista Objetos en el panel Utilidades al espacio arriba debajo de su Objeto Ventana. Seleccione el objeto. Haga clic en el inspector de identidad en el panel de Utilidades. Cambie la clase al delegado de la aplicación (MyAppDelegate, en este ejemplo)

Abra el inspector de conexiones para MyAppDelegate. Conecte la salida de la ventana a la ventana que ya existe en el archivo de interfaz.

Haga clic en el propietario del archivo a la izquierda y luego haga clic en el inspector de identidad en el panel de Utilidades. Cambiar la clase a UIApplication

Abra el inspector de conexiones para el propietario del archivo. Conecte la salida de delegado al objeto MyAppDelegate.

4. Finalmente, y muy importante, haga clic en el objeto Ventana en el archivo de interfaz. Abra el inspector de Atributos. Asegúrese de que esté marcado “Visible al inicio”.

Eso es todo lo que tuve que hacer para que funcione para mí. ¡Buena suerte!

Si usa MTStatusBarOverlay, obtendrá este error.

MTStatusBarOverlay crea una ventana adicional ([[UIApplication sharedApplication] windows) que no tiene un controlador raíz.

Esto no parece causar un problema.

Recibí el mismo error después de reemplazar mi UI con Storyboard, usando XCode 4.6.3 y iOS 6.1

Lo resolvió borrando todo el código de didFinishLaucnhingWithOptions en AppDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } 

OrdoDei dio una respuesta correcta y valiosa. Estoy agregando esta respuesta solo para dar un ejemplo de un método didFinishLaunchingWithOptions que usa su respuesta, así como la contabilidad de los comentarios de los demás respecto a Navigation Controller.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. // Instantiate the main menu view controller (UITableView with menu items). // Pass that view controller to the nav controller as the root of the nav stack. // This nav stack drives our *entire* app. UIViewController *viewController = [[XMMainMenuTableViewController alloc] init]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; // Instantiate the app's window. Then get the nav controller's view into that window, and onto the screen. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // [self.window addSubview:self.navigationController.view]; // The disabled line above was replaced by line below. Fixed Apple's complaint in log: Application windows are expected to have a root view controller at the end of application launch [self.window setRootViewController:self.navigationController]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } 

Esto ocurrió para mí porque inadvertidamente comencé a comentar:

 [self.window makeKeyAndVisible]; 

de

 - (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*) 

Pude configurar el controlador de vista inicial en la pantalla de resumen de xcode.

Haga clic en el nombre del proyecto más alto en el explorador de archivos de la izquierda (debe tener un pequeño icono de plano). En la columna central, haga clic en el nombre de su proyecto en ‘OBJETIVOS’, (debe tener un pequeño icono de lápiz ‘A’ junto a él). Busque en ‘Información de implementación de iPhone / iPod’ y busque ‘Interfaz principal’. Debería poder seleccionar una opción del menú desplegable.

En la parte superior de la respuesta “sho”, eso es correcto (el cuarto parámetro de UIApplicationMain debe ser el nombre del controlador principal), agrego algunos comentarios.

Recientemente cambié el ‘modelo’ de una aplicación mía al utilizar MainWindow.xib para construir una ventana programáticamente. La aplicación utilizaba una plantilla anterior que creaba MainWindow automáticamente. Como quería soportar una XIB de controlador diferente para iPhone 5, es más fácil elegir el XIB correcto programáticamente cuando se crea el delegado de la aplicación. También eliminé MainWindow.xib del proyecto.

El problema fue que olvidé completar el cuarto parámetro en UIApplication principal y OLVIDÉ QUITAR MainWindow de “Interfaz principal” en Project Summary.

Esto causó un GRAN problema: emitió la advertencia inofensiva “Se espera que las aplicaciones …” en los dispositivos de desarrollo, pero cuando se fue a la tienda de aplicaciones, se rompió en los teléfonos de los consumidores, ¡ya que MainWindow ya no estaba en el paquete! Tuve que solicitar una revisión acelerada para la corrección de errores.

Otro síntoma es que a veces aparecía un bloque blanco, como un UIView en blanco, cuando se cambiaba la Configuración y la aplicación se colocaba en primer plano. En el iPhone 5, estaba claro que era un bloque de 320×480. Quizás la MainWindow faltante se estaba creando en modo de desarrollo, usando el tamaño anterior. Acababa de encontrar este error cuando los primeros informes del accidente llegaron a la bandeja de entrada.

La instalación de la aplicación de App Store en lugar de XCode mostró que la aplicación se bloqueó y que el problema de MainWindow se reveló en el registro, por lo que pude ver que no era una combinación especial de dispositivos + versiones de IOS.

Para agregar a la respuesta de Mike Flynn, desde la actualización a Xcode 7 y la ejecución de mi aplicación en un dispositivo con iOS 9, agregué esto a mi (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 // Hide any window that isn't the main window NSArray *windows = [[UIApplication sharedApplication] windows]; for (UIWindow *window in windows) { if (window != self.window) { window.hidden = YES; } } 

Este problema ocurre cuando no tiene el Interface Builder configurado correctamente.

Asegúrate de que la ventana del Delegado de tu aplicación y los puntos de vista de Control estén conectados:

En MainWindow.xib, mantenga el control, haga clic en Delegar aplicación y arrastre al objeto Ventana. Seleccionar ventana Mantenga el control y seleccione de nuevo delegar la aplicación, arrastre a su controlador de vista raíz y seleccione viewController.

Este error también aparece cuando el propietario del archivo de MainWindow.xib está configurado incorrectamente.

El propietario del archivo es UIApplication
-> objeto insertado de la clase de delegado de la aplicación con salida de ventana conectada a la ventana