Después de ejecutar la función
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
hay un accidente:
Assertion failure in
-[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', `enter code here`reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
0 CoreFoundation 0x0000000109377885 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000108df0df1 objc_exception_throw + 48
2 CoreFoundation 0x00000001093776ea +[NSException raise:format:arguments:] + 106
3 Foundation 0x0000000108a42bb1 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
4 UIKit 0x000000010760e350 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2875
5 UIKit 0x000000010760b73f -[UIApplication workspaceDidEndTransaction:] + 188
6 FrontBoardServices 0x000000010b87fd7b FrontBoardServices + 163195
7 FrontBoardServices 0x000000010b880118 FrontBoardServices + 164120
8 CoreFoundation 0x00000001092a20f1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
9 CoreFoundation 0x0000000109297eac __CFRunLoopDoSources0 + 556
10 CoreFoundation 0x0000000109297363 __CFRunLoopRun + 867
11 CoreFoundation 0x0000000109296d78 CFRunLoopRunSpecific + 488
12 UIKit 0x000000010760b091 -[UIApplication _run] + 402
13 UIKit 0x000000010760f79b UIApplicationMain + 171
14 bbwc 0x00000001037a9998 main + 344
15 libdyld.dylib 0x000000010a45ca05 libdyld.dylib + 10757
16 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Este proyecto es un proyecto antiguo, ¿qué debo hacer para que se compile y se ejecute con Xcode 7 e iOS 9?
Respuestas:
De su mensaje de error:
¿Qué edad tiene este proyecto "antiguo"? Si son más de unos pocos años, todavía tiene:
En su lugar, debería reemplazarlo con:
fuente
Si ya ha configurado el rootViewController de su self.window en el delegado de su aplicación y sigue recibiendo este error en tiempo de ejecución, entonces probablemente tenga más de una ventana en su UIApplication, una de las cuales puede no tener un rootViewController asociado. Puede recorrer las ventanas de su aplicación y asociar un viewController vacío a su rootViewController para corregir el error que está recibiendo.
Aquí hay un código que recorre las ventanas de la aplicación y asocia un ViewController vacío al rootViewController si falta una ventana.
Actualización: Aparentemente, hay una ventana dedicada a la barra de estado que generalmente causa este problema. El código anterior debería corregir este error.
fuente
XCODE 7 requiere que todos los Windows deben tener un rootViewController. Puede usarlo fácilmente:
¡Funciona bien si solo necesita usar UIWindow (para ejemplos sencillos de cualquier tutorial, antes de Xcode 7)!
fuente
Parece que desde iOS 9.1 (?) O Xcode 7.1, cualquier
UIWindow
instanciado duranteapplication(_:didFinishLaunchingWithOptions:)
necesita tener unrootViewController
conjunto antes de abandonar ese método.Anteriormente, era suficiente que solo la ventana principal tuviera un
rootViewController
conjunto durante ese método. Ahora, cualquierUIWindow
instancia debe tener unarootViewController
propiedad válida .El culpable aquí podría ser su propio código si utiliza
UIWindow
y también cualquier otra biblioteca de terceros que intente inicializar una nuevaUIWindow
instancia durante este tiempo (como superposiciones de mensajes de la barra de estado, etc.).NOTA : También obtiene el mismo error si no configura el
rootViewControler
en su ventana principal o si su guión gráfico no está configurado correctamente. Mencionar esto como una nota al margen, ya que esos casos son bastante obvios y fáciles de solucionar.fuente
Esto también me ha mordido hoy, y me costó algunas horas arreglarlo: mi aplicación tiene la ventana en un "MainWindow.xib", completo con el controlador de navegación y el controlador de vista raíz que lo acompaña, que se instanciaron automáticamente en el orden correcto , con Xcode 6 y iOS8.
En iOS9, esa aplicación aún funciona bien cuando se descarga de la AppStore, pero no cuando se crea nuevamente con Xcode 7 y se ejecuta en iOS 9. En el momento en que el delegado de la aplicación está ejecutando su método applicationDidBecomeActive: el controlador de vista raíz ahora no lo está cargado, ya que solía ser antes! Eso hizo que el controlador de vista raíz perdiera la llamada a mi código de estado de restauración.
Solucioné esto creando una instancia del controlador de vista raíz yo mismo, en código, y restaurando su estado desde viewDidLoad, explícitamente.
fuente
Debe configurar la propiedad rootviewcontroller de cada ventana en su aplicación
fuente
Tengo un proyecto anterior que funcionó en iOS 8 pero no en iOS 9. Si su interfaz principal está configurada en MainWindow.xib, actualícela a un guión gráfico. Esto me lo arregló:
fuente
Simplemente configure su rootViewController en navigationController, que es su UIViewController en el app-delegate.rb como mi código a continuación. Soy nuevo en ruby pero espero que esto ayude ...
fuente
Entré en este problema con una aplicación que heredé más o menos. Después de verificar que el guión gráfico estaba configurado correctamente como la interfaz principal de la aplicación y que el guión gráfico tenía un RootViewController, todavía recibía el bloqueo.
Lo que descubrí después de investigar más a fondo que el bloqueo estaba siendo causado por alguna lógica de vista (SVProgressHud)
- (void)applicationDidBecomeActive:(UIApplication *)application
. Este parece ser un comportamiento nuevo en Xcode7, pero por lo que puedo decir, SVProgressHud estaba haciendo referencia al controlador rootview antes de que lo estableciera el guión gráfico. En última instancia, la actualización de SVProgressHud a 2.0 solucionó el error.fuente
Solución Swift 2 que funcionó para mí:
Inserte el código siguiente en AppDelegate -> didFinishLaunchingWithOptions
self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass
fuente