web-dev-qa-db-fra.com

Erreur "Les fenêtres d'application doivent comporter un contrôleur de vue racine à la fin du lancement de l'application" lors de l'exécution d'un projet avec Xcode 7, iOS 9

Après l'exécution de la fonction

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

il y a un crash:

 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

Ce projet est un ancien projet. Que dois-je faire pour le construire et l'exécuter avec Xcode 7 et iOS 9?

82
andrew wang

De votre message d'erreur:

Les fenêtres d’application devraient avoir un contrôleur de vue racine à la fin du lancement de l’application.

Quel âge a ce "vieux" projet? Si c'est plus que quelques années, avez-vous encore:

[window addSubview:viewController.view];

Vous devriez plutôt le remplacer par:

[window setRootViewController:viewController];
167
James Webster

Si vous avez déjà défini le rootViewController de votre self.window dans votre délégué d'application et que vous obtenez toujours cette erreur au moment de l'exécution, vous avez probablement plusieurs fenêtres dans votre UIApplication dont une ne peut pas être associée à un rootViewController. Vous pouvez parcourir les fenêtres de vos applications et associer un viewController vide à son rootViewController pour corriger l'erreur que vous obtenez.

Voici un code qui parcourt les fenêtres de l'application et associe un ViewController vide au rootViewController si une fenêtre manque de celui-ci.

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

Mise à jour: Apparemment, il existe une fenêtre dédiée à la barre d'état qui est généralement à l'origine de ce problème. Le code ci-dessus devrait corriger cette erreur.

36
Bms270

XCODE 7 requiert que tout Windows ait un rootViewController. Vous pouvez utiliser easy:

UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;

Cela fonctionne bien si vous devez utiliser uniquement UIWindow (pour des exemples simples tirés de n'importe quel tutoriel - avant Xcode 7)!

21
Envoy

Il semble que depuis iOS 9.1 (?) Ou Xcode 7.1, toute UIWindow instanciée au cours de application(_:didFinishLaunchingWithOptions:) nécessite de définir un rootViewController avant de quitter cette méthode.

Auparavant, il suffisait que seule la fenêtre principale ait un rootViewController défini lors de cette méthode. Désormais, toute instance UIWindow doit avoir une propriété rootViewController valide.

Le coupable ici pourrait être votre propre code si vous utilisez UIWindow ainsi que toute autre bibliothèque tierce qui essaie d'initialiser une nouvelle instance UIWindow pendant ce temps (comme les superpositions de messages de la barre d'état, etc.) .

NOTE: Vous obtenez également la même erreur si vous ne définissez pas la variable rootViewControler sur votre fenêtre principale ou si votre scénarimage n'est pas configuré correctement. Mentionner cela comme une note secondaire, car ces cas sont assez évidents et faciles à résoudre.

13
lipka

Cela m’a également mordu aujourd’hui et cela m’a pris quelques heures pour le réparer: mon application a la fenêtre dans un "MainWindow.xib", avec le contrôleur de navigation et le contrôleur de vue racine associé, qui ont tous été instanciés automatiquement dans le bon ordre. , avec Xcode 6 et iOS8.

Sur iOS9, cette application fonctionne toujours correctement lorsqu'elle est téléchargée à partir de l'AppStore, mais pas lorsqu'elle est nouvellement construite avec Xcode 7 et exécutée sur iOS 9. Au moment où le délégué de l'application exécute son applicationDidBecomeActive: méthode, le contrôleur de vue racine est maintenant pas chargé, comme il l'était avant! Le contrôleur de vue racine a donc manqué l'appel de mon code d'état de restauration.

J'ai résolu ce problème en instanciant moi-même le contrôleur de vue racine, en code, et en restaurant son état à partir de viewDidLoad, de manière explicite.

3
RickJansen

Vous devez définir la propriété rootviewcontroller de chaque fenêtre dans votre application.

2
alla

Il suffit de définir votre rootViewController sur navigationController, qui est votre UIViewController dans le fichier app-delegate.rb, comme mon code ci-dessous. Je suis nouveau dans Ruby mais j'espère que cela a aidé ...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
1
BigPun86

Je suis entré dans ce problème avec une application dont je hérite davantage. Après avoir vérifié que le storyboard était correctement configuré en tant qu'interface principale des applications et que le storyboard avait un RootViewController, je continuais à avoir l'accident.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

Ce que j’ai découvert après quelques investigations supplémentaires, c’est que le crash était dû à l’appel de la logique de visualisation (SVProgressHud) dans - (void)applicationDidBecomeActive:(UIApplication *)application. Cela semble être un nouveau comportement dans Xcode7, mais pour autant que je sache, SVProgressHud faisait référence au rootviewcontroller avant qu'il ne soit défini par le storyboard. La mise à jour de SVProgressHud à la version 2.0 a finalement résolu le problème.

1
Bueno

La solution Swift 2 qui a fonctionné pour moi:

Insérez le code ci-dessous dans AppDelegate -> didFinishLaunchingWithOptions

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass
0
Fox5150

J'ai un projet plus ancien qui fonctionnait dans iOS 8 mais pas dans iOS 9. Si votre interface principale est définie sur MainWindow.xib, mettez-le à jour en tant que scénario. Cela a résolu le problème pour moi:

  1. Créez un nouveau projet, l'application Single View convient parfaitement.
  2. Copiez le fichier Main.storyboard dans votre projet ou créez le vôtre.
  3. Ouvrez les paramètres de votre projet et réglez votre interface principale sur Main.storyboard Set your Main Interface to Main.storyboard
0
Adrian