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?
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];
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.
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)!
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.
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.
Vous devez définir la propriété rootviewcontroller de chaque fenêtre dans votre application.
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
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.
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
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: