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

383

Me sale el siguiente error en mi consola:

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

A continuación se muestra mi application:didFinishLaunchWithOptionsmétodo:

- (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 UITabBarControllerdelegado de 's está conectado al delegado de la aplicación.

Alguien sabe cómo solucionar este problema?

ArtSabintsev
fuente
55
Haga un NSLog de self.tabBarController justo antes de realizar la tarea. El mensaje solo se activa si el controlador es nulo. Si es nulo y se ha asegurado de que sus conexiones sean correctas, intente crear instancias del controlador en el código.
FeifanZ
intenta comentar la inicialización de la ventana ...
mira

Respuestas:

188

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

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
sho
fuente
49
Otra opción es asegurarse de que la clase delegada de la aplicación se importe en main y use NSStringFromClass. Así es como Xcode ahora crea el archivo main.m. Por ejemplo: #import "AppDelegate.hy luegoint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho
10
asegúrese de que self.windowse inicializa comoself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor
1
Probé las opciones anteriores, no funcionó para mí. Y no estoy usando un Storyboard.
Jowie
3
No tuvo ningún efecto para mí, el mismo mensaje "Se esperan aplicaciones ..." después de realizar el cambio. La solución fue la respuesta de OrdoDei (ver arriba o abajo) que funcionó perfectamente.
Andrew
1
Si ve una vista en blanco en el simulador pero espera ver el diseño de un guión gráfico, asegúrese de deshacerse del código en la función de delegado raíz "aplicación didFinishLaunchingWithOptions ..." que se señala en main.m y solo tiene "retorno SI;" en eso.
Olivier de Jonge
435

Reemplazar en AppDelegate

 [window addSubview:[someController view]];

a

  [self.window setRootViewController:someController];
OrdoDei
fuente
Esto eliminó el mensaje para mí. Todavía no muestra una ventana posterior, pero puede ser un problema diferente. Gracias.
Jazzmine
3
Si está utilizando un UINavigationController, primero debe [[UINavigationController] initWithRootViewController: tableViewController] y luego usar el código anterior [self.window setRootViewController: self.navigationController] para configurar el controlador de vista raíz de la ventana
emdog4
Cocos2d tiene un comentario que dice "// AddSubView no funciona en iOS6" Así que esto me lo arregló, ya que estoy usando iOS 6.
Almo
1
La addSubviewlínea era parte de la plantilla del proyecto en una versión anterior de Xcode / iOS SDK. Si la aplicación retrocede mucho, es posible que la tenga incluso si no la escribió.
Seva Alekseyev
hola estoy obteniendo este error: - *** Error de aserción en - [UIApplication _runWithMainScene: transitionContext: complete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 cómo resolver esto
Akash Raghani
70

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, realmente no sabía de dónde provenía el error, 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 causando problemas

- (void)viewDidLoad

a

- (void)viewDidAppear:(BOOL)animated

y el error dejó de aparecer. Mi problema específicamente fue causado por hacer un UIAlertViewespectáculo.

En su caso, le sugiero que consulte el código en el controlador de vista activa 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 plumín en lugar de en el código, o si desea hacerlo en código, intente mover el código al método apropiado del controlador de vista activa tabBarController.

¡Buena suerte!

Warkst
fuente
1
Warkst, gracias por la respuesta. En mi caso, no puedo mover el código viewDidLoad:(sin agregar una bandera), ni debo hacer esto. De todos modos, gracias por la sugerencia!
ArtSabintsev
2
Encontré esto hoy y me alegro de haberlo hecho - el mismo problema - estaba mostrando un lanzamiento uialert en viewDidLoad. Cambió a viewDidAppear y funciona bien. No estoy seguro de qué mayor bien logra Apple al cambiar esto en iOS5.
GuybrushThreepwood
Gracias por la sugerencia de que la vista de alerta lo estaba causando, ese mismo problema también me pasó a mí.
Chris
1
¿Podría decirnos qué código tuvo que eliminar para solucionarlo? Estoy usando mi viewDidLoadpara muchas cosas, configurando todas las cosas por primera vez, como agregar datos al UITableView. No puedo moverlo viewDidAppear:porque solo quiero que se dispare una vez.
Jowie
1
El problema no era la función incorrecta. El problema era que estaba olvidando llamar a [super viewDidLoad] en su función viewDidLoad, eliminando efectivamente la carga de la punta. Lo mismo me ha pasado más de una vez.
Borrrden
47

Obtuve esto cuando comencé con la plantilla "Aplicación vacía" y luego agregué manualmente un XIB. Lo resolví configurando el nombre principal de Nib como lo sugirió Sunny. El paso que falta en este escenario es eliminar

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

desde

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 también lo conectó con su ventana y Delegado de aplicaciones en el archivo XIB.

revs jlujan
fuente
Esto también me lo arregló. Estaba usando una aplicación con pestañas con un Storyboard al que intentaba agregar CoreData, y me encontré con este problema.
gitaarik
jajaja si agrego esto, recibo dos advertencias de que se espera que las ventanas de la aplicación tengan un controlador de vista raíz.
George Asda
46

Esto me paso a mi. Resuelto editando el archivo .plist. Especifique el nombre base del archivo NIB principal (debe ser MainWindow.xib). Espero que esto ayude.

ingrese la descripción de la imagen aquí

soleado
fuente
2
¡Esto funcionó para mí! Esto funciona cuando crea un proyecto vacío en Xcode 4.2, donde no estará presente MainWindow y así es como tenemos que conectarlo.
jeevangs
El problema para nosotros sucedió cuando inadvertidamente eliminamos la línea 'Nombre base del archivo de punta principal' del archivo 'Info.plist'. Insertar esta línea nuevamente solucionó el problema.
rtovars
También puede configurar esto en las propiedades del proyecto. Seleccione el proyecto, su objetivo, puede editar esto en Resumen -> Información de implementación de iPhone / iPad.
doekman
Este fue realmente el problema para mí, lo que me llevó a múltiples problemas relacionados con las llamadas a viewDidLoad y viewWillAppear dos veces en rootViewController. En mi caso, eliminar esta fue la solución
whyoz
27

Me encontré con el mismo problema recientemente, cuando construyo 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 se borró la propiedad de la interfaz principal en la pestaña de resumen de mi objetivo de aplicación. Entonces necesitaba configurarlo de nuevo.


Si este no es el punto, y si tabBarController sigue siendo nulo, siempre puede crear mediante programación su ventana y controlador raíz. Como 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 programatically.");
        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.

denicija
fuente
24

Actualicé a iOS9 y comencé a obtener este error de la nada. Pude solucionarlo pero agregué el siguiente código a- (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;
    }
}
Mike Flynn
fuente
Tengo curiosidad por saber cuántas ventanas tenía su aplicación y si todas tenían un controlador de vista raíz. Gracias
DrAL3X
55
NOTA : Esta respuesta es una solución alternativa y no soluciona la causa raíz. Ver stackoverflow.com/a/33958144/1116061
lipka
¡Eres un verdadero héroe!
user2161301
21

Ninguna de las sugerencias anteriores resolvió mi problema. La mía fue esta:

Añadir:

window.rootViewController = navigationController;

después:

[window addSubview:navigationController.view];

en mi applelegate's

- (void)applicationDidFinishLaunching:(UIApplication *)application {
RyeMAC3
fuente
20
  • Seleccione su "Ventana" en su archivo Nib
  • En "Inspector de atributos", marque "Visible en el lanzamiento"

¡imagen![]

  • Esto sucede cuando su archivo nib se crea manualmente.
  • Esta solución funciona para el modo de plumín normal, no para el modo guión gráfico
4 revoluciones
fuente
Esto solo se encuentra en el modo Storyboard, creo.
ArtSabintsev
No, este proyecto era el modo de punta normal. Esta es una captura de pantalla del modo Storyboard. "Visible en el lanzamiento" frente a "Es el controlador de vista inicial".
bearMountain
3
Si el archivo plumín de la ventana creado manualmente, y "visible en el lanzamiento" está desmarcado de manera predeterminada, aparecerá este mensaje después del inicio de la aplicación, ¡esto soluciona mi problema!
ZYiOS
¡¡¡OH GRACIAS!!! Finalmente, una solución a esta molesta advertencia. Incluso si lo tiene makeKeyAndVisibleno resuelve el problema. SOLO esto resolvió la advertencia para mí. ¡GRACIAS!
tacos_tacos_tacos
"Esto sucede en el modo de plumín normal, no en el modo de guión gráfico" No es muy cierto. Estoy frente a la misma cuestión con Storyboardtambién
thesummersign
19

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 el UIViewController subclass nombre RootViewController , desmarque With XIB para la interfaz de usuario (suponiendo que ya tenga uno) y coloque este código en su AppDelegate :: didFinishLaunchingWithOptions

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

seguro: debe importar RootViewController.h y crear la variable

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

rémy
fuente
El enlace del artículo cupsofcocoa.com está muerto. ¿Alguna idea de si hay una copia en alguna parte?
Ríomhaire
1
esto se ha movido a binpress.com, actualizado el enlace en la respuesta
rémy
Ese es un gran enlace. Buena lectura y explica lo que está pasando. También encontré este problema usando un libro antiguo (ya que primero quiero aprender Objective-C) pero escribiendo código en el último XCode 7, que no tiene las plantillas más antiguas.
ibaralf
11

También tuve este error, pero a diferencia de cualquiera de las respuestas enumeradas anteriormente, la mía se debió 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 programación, pero lo perdí porque se parecía mucho a otros métodos como viewDidLoad que normalmente uso, no lo capté.

Para resolver, simplemente elimine ese método si no está creando mediante programación la jerarquía de vistas, también conocida como nib o storyboard.

trcarden
fuente
Puedo confirmar que esto puede causar el problema. Tuve la misma situación al seguir el tutorial sobre TableView donde crean establecer los delegados en loadView. Después de mover ese código a viewDidLoad y eliminar loadView, todo comenzó a funcionar según sea necesario.
Eugen
Todavía puede hacer uso de la vista de carga pero agregue [super loadView]; Al principio.
Hermann Klecker
1
Hmm ... la documentación de loadView establece específicamente que no debe llamar al método super.
Joshua Sullivan
Anulé el UIViewController predeterminado en un guión gráfico y descubrí que el código de plantilla para crear una subclase de UIViewController tiene loadView habilitado de forma predeterminada, lo que me causa ... perdí más de una hora en esta tontería. ¡Gracias por publicar esto!
slycrel
11

Tengo estos problemas también. Tengo mi proyecto ejecutado en xcode4.2.1. He leído todos los comentarios allí arriba, 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 descomenté. todo esta bien para mi Espero que esto sea útil para ustedes.

Bruce Lee
fuente
El código: "self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] limits]];" causar un error, así que lo eliminé.
Grigori A.
11

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

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

Asegúrese de que didFinishLaunchingWithOptions devuelva SÍ. Si eliminó la línea 'return YES', esto causará el error. Este error puede ser especialmente común con los usuarios de guiones gráficos.

anticiclope
fuente
muchas felicitaciones, esto es lo que quería (proyecto vacío con guión gráfico)
Shtirlic
2
Igual que aquí. Gracias. Si crea una aplicación vacía, este método se completa con la creación manual de la ventana. Esto debe cambiarse para que simplemente devuelva SÍ. Thx
Ben G
10

Con mi primera vista MenuViewControllerañadí:

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

en el método de delegado de aplicaciones:

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

Eso funciono.

cujino
fuente
10

Hubo un ligero cambio alrededor de iOS 5.0 más o menos, lo que requiere que tengas un controlador de vista raíz. Si su código se basa en un código de muestra anterior, como GLES2Sample , no se creó ningún controlador de vista raíz en esas muestras de código.

Para arreglar (ese GLES2Sample, por ejemplo), directamente applicationDidFinishLaunching, creo un controlador de vista raíz y adjunto mi glView.

- (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 realmente no afecta su aplicación de otra manera.

revs bobobobo
fuente
9

Intente conectar IBOutlet del controlador de la barra de pestañas 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.

d.lebedev
fuente
8

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

Desde el menú desplegable asociado con "Interfaz principal", seleccione otra entrada y luego vuelva a seleccionar "Ventana principal" y luego reconstruya.

ingrese la descripción de la imagen aquí

RawMean
fuente
8

Me encontré con el mismo problema pero estaba usando storyboard

Asignando mi storyboard InitialViewControllera mi ventana rootViewController.

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.

thesummersign
fuente
7

Comencé a tener este mismo problema justo después de actualizar a Xcode 4.3, y solo al comenzar un proyecto desde cero (es decir, crear un proyecto vacío, luego crear un UIViewController y luego crear un archivo plum separado).

Después de poner TODAS las líneas que solía y de asegurarme de que tenía las conexiones correctas, seguí recibiendo ese error, y el archivo nib que estaba tratando de cargar a través del controlador de vista (que estaba configurado como rootController) 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 por defecto el método - (vacío) loadView; a la sección de implementación del controlador de vista. Después de leer cuidadosamente los comentarios en su interior, quedó claro cuál era el problema. El comentario indica que se anula el método loadView si se crea una vista mediante programación (y estoy parafraseando), de lo contrario NO se anula loadView si se usa una plumilla. No había nada más dentro de este método, por lo que, en efecto, estaba anulando el método (y no haciendo nada) MIENTRAS estaba usando un archivo plumín, que dio el error.

La SOLUCIÓN fue eliminar completamente el método loadView de la sección de implementación, o llamar al método padre agregando [super loadView].

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

Raz
fuente
ese fue exactamente mi problema! Agregué una implementación loadView pero no llamé super. Hice algunos otros cambios de código, no podía recordar qué diablos hice. Me quedé atrapado durante 2 horas porque ese cambio parecía muy inocuo.
LearnCocos2D
6

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

En la aplicación: didFinishLaunchingWithOptions:

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

que llama después de 1 segundo:

- (void)callPopUp
{
    // call UIAlertView
}
janeway
fuente
Gracias, esto resolvió mi problema. Debe esperar para mostrar la alerta hasta que se cargue la ventana. En mi caso, acabo de hacer [alert performSelector: @selector (show) withObject: nil afterDelay: 1.0];
invierno profundo
6

Yo tuve el mismo problema. Si está creando una aplicación basada en ventanas "desde cero" como yo, deberá 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 <UIApplicationDelegate> // 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 con el botón izquierdo en el proyecto; haga clic en resumen). En Información de implementación de iPhone / iPod (y la sección correspondiente del iPad si lo desea) y seleccione su nuevo archivo de interfaz en " Interfaz principal "cuadro combinado.

3. Conéctelo 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 desde la lista de Objetos en el panel de Utilidades al espacio arriba de debajo de su objeto de Ventana. Selecciona el objeto. Haga clic en el inspector de identidad en el panel 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 Utilidades. Cambiar la clase aUIApplication

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 "Visible en el lanzamiento" esté marcado.

Eso es todo lo que tenía que hacer para que funcionara para mí. ¡Buena suerte!

Tom
fuente
6

Si usa MTStatusBarOverlay, obtendrá este error.

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

Esto no parece causar un problema.

Vorlon confundido
fuente
¿Estás seguro de eso? ¿Lo has probado?
Sergey Grischyov
Estoy seguro de que crea una ventana y estoy seguro de que no crea un problema en mis aplicaciones.
Confundido Vorlon
Puede configurar un VC ficticio en MTStatusBarOverlay para solucionarlo.
Wesley
Este fue exactamente mi problema. Tuve un tipo similar de configuración con una ventana que se agregó para una barra de notificaciones, y una vez que comenté eso, ¡el error desapareció! Parece ser inofensivo en este caso.
Aaron Zinman
6

Recibí el mismo error después de reemplazar mi interfaz de usuario con un Storyboard, usando XCode 4.6.3 e iOS 6.1

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
Pétur Ingi Egilsson
fuente
5

OrdoDei dio una respuesta correcta y valiosa. Estoy agregando esta respuesta solo para dar un ejemplo de un didFinishLaunchingWithOptionsmétodo que usa su respuesta, así como para tener en cuenta los comentarios de los demás con respecto al Controlador de navegación.

- (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;
}
Albahaca Bourque
fuente
4

Esto ocurrió para mí porque accidentalmente comenté:

[self.window makeKeyAndVisible];

desde

- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)
nicerobot
fuente
4

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

Haga clic en el nombre superior del proyecto 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 debajo de 'OBJETIVOS' (debe tener un pequeño ícono de lápiz 'A' al lado). Busque en 'Información de implementación de iPhone / iPod' y busque 'Interfaz principal'. Debería poder seleccionar una opción del menú desplegable.

RachelD
fuente
4

Además de la respuesta "sho", eso es correcto (el cuarto parámetro de UIApplicationMain debería ser el nombre del controlador principal), agrego algunos comentarios.

Recientemente he cambiado el 'modelo' de una aplicación mía usando MainWindow.xib para construir una ventana mediante programación. La aplicación utilizó una plantilla anterior que creó esa ventana principal automáticamente. Como quería admitir una vista de controlador diferente XIB para iPhone 5, es más fácil elegir el XIB correcto mediante programación cuando se crea el delegado de aplicaciones. También eliminé MainWindow.xib del proyecto.

El problema era que olvidé llenar el cuarto parámetro en la aplicación principal de UIA y OLVIDÉ ELIMINAR MainWindow de "Interfaz principal" en el Resumen del proyecto.

Esto causó un GRAN problema: generó la advertencia inofensiva "Se espera que las aplicaciones ..." en los dispositivos de desarrollo, pero cuando fue a App Store, se rompió en los teléfonos de los consumidores y se bloqueó porque 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 una UIView en blanco, cuando se cambiaba la Configuración y la aplicación se ponía en primer plano. En el iPhone 5 estaba claro que era un bloque de 320x480. Quizás la MainWindow que faltaba se estaba creando en modo de desarrollo, usando el tamaño anterior. Acababa de encontrar este error cuando los primeros informes del bloqueo llegaron a la bandeja de entrada.

La instalación de la aplicación desde App Store en lugar de desde XCode mostró que la aplicación realmente se bloqueó, y 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.

epx
fuente
4

Para agregar a la respuesta de Mike Flynn, desde que actualicé a Xcode 7 y ejecuté mi aplicación en un dispositivo 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;
    }
}
Kevin_TA
fuente
Tengo curiosidad por saber cuántas ventanas tenía su aplicación y si todas tenían un controlador de vista raíz. Gracias
DrAL3X
3

Este problema ocurre cuando no tiene Interface Builder configurado correctamente.

Asegúrese de que la ventana de Delegado de la aplicación y las tomas viewController estén conectadas:

En su MainWindow.xib, mantenga presionado el control, haga clic en Delegado de aplicaciones y arrastre hasta el objeto Ventana. Seleccionar ventana Mantenga presionado el control y seleccione el delegado de la aplicación nuevamente, arrastre a su controlador de vista raíz y seleccione viewController.

uranazo
fuente
3

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 delegada de la aplicación con salida de ventana conectada a la ventana

JakubKnejzlik
fuente
Creé un archivo xib manualmente y comencé a recibir este error. ¡gracias un montón!
RawMean