web-dev-qa-db-fra.com

Les applications doivent avoir un contrôleur de vue racine à la fin du lancement de l'application.

Je reçois l'erreur suivante dans ma console:

Les applications doivent avoir un contrôleur de vue racine à la fin du lancement de l'application.

Voici ma méthode 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;
}

Dans Interface Builder, le délégué UITabBarController est connecté au délégué d'application.

Quelqu'un sait comment résoudre ce problème?

379
ArtSabintsev

J'ai eu le même problème. Vérifiez votre main.m. Le dernier argument doit être défini sur le nom de la classe qui implémente le protocole UIApplicationDelegate.

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

Remplacer dans AppDelegate

 [window addSubview:[someController view]];

à

  [self.window setRootViewController:someController];
434
OrdoDei

J'ai eu la même erreur en essayant de changer le premier contrôleur de vue chargé dans

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

Au début, je ne savais pas vraiment d'où venait l'erreur, donc je l'ai réduite et j'ai découvert ce qui n'allait pas. Il s’est avéré que j’essayais de changer l’affichage d’une vue avant qu’elle ne soit réellement affichée à l’écran. La solution consistait donc à déplacer ce code dans le contrôleur de vue qui me posait problème

- (void)viewDidLoad

à

- (void)viewDidAppear:(BOOL)animated

et l'erreur a cessé d'apparaître. Mon problème a été spécifiquement causé par la création d'un spectacle UIAlertView.

Dans votre cas, je vous suggère de consulter le code dans le contrôleur de vue actif de tabBarController (car il s'agit probablement d'un problème dans ce contrôleur de vue). Si cela ne fonctionne pas, essayez de définir les paramètres de démarrage dans le fichier nib plutôt que dans le code. Si vous souhaitez le faire dans le code, essayez de déplacer le code vers la méthode appropriée du contrôleur de vue actif de tabBarController.

Bonne chance!

69
Warkst

Je l'ai eu lorsque j'ai commencé avec le modèle "Application vide", puis en ajoutant manuellement un fichier XIB. Je l'ai résolu en définissant le nom principal de Nib, comme suggéré par Sunny. L'étape manquante dans ce scénario consiste à supprimer

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

de

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

Comme cela écrasera l'instance de votre fenêtre créée dans le fichier Xib. Cela suppose que vous avez créé un ViewController et que vous l'avez connecté avec votre fenêtre et votre délégué App également dans le fichier XIB.

47
jlujan

Cela m'est arrivé Résolu en modifiant le fichier .plist. Spécifiez le nom de base du fichier nib principal (Doit être MainWindow.xib). J'espère que cela aidera.

enter image description here

46
arindam

Je rencontre le même problème récemment, lors de la construction d’un projet avec ios5 sdk. Au début, il construisait et fonctionnait correctement, mais ensuite l'erreur est apparue.
Dans mon cas, la solution était plutôt simple.
Ce qui manquait, était-ce en quelque sorte le Interface principale propriété dans l'onglet de résumé de ma cible d'application a été effacé. Donc, je devais le régler à nouveau.


Si ce n’est pas le but, et si le tabBarController est toujours nul, vous pouvez toujours créer par programme vos contrôleurs de fenêtre et racine. Comme solution de rechange, j'ai ajouté le code suivant à mon projet

- (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;
}

Cela ne fonctionnera que si la solution de sho est également implémentée.

27
denicija

Je suis passé à iOS9 et j'ai commencé à obtenir cette erreur de nulle part. J'ai pu le réparer mais en ajoutant le code ci-dessous à - (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;
    }
}
24
Mike Flynn

Aucune des suggestions ci-dessus n'a résolu mon problème. Le mien était ceci:

Ajouter:

window.rootViewController = navigationController;

après:

[window addSubview:navigationController.view];

dans mon appdelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
21
RyeMAC3
  • Sélectionnez votre "fenêtre" dans votre fichier nib
  • Dans "Inspecteur d'attributs", cochez la case "Visible au lancement".

image![]

  • Cela se produit lorsque votre fichier nib est créé manuellement.
  • Ce correctif fonctionne pour le mode nib normal - pas le mode storyboard
20
bearMountain

comment ajouter un RootViewController pour iOS5

si votre application n'a pas utilisé de RootViewController jusqu'à présent, créez-en un;) en cliquant sur Fichier> Nouveau> Nouveau fichier; sélectionnez UIViewController subclass nommez-le RootViewController , décochez la case Avec l'interface XIB pour l'interface utilisateur (en supposant que vous en ayez déjà un) et placez ce code dans votre AppDelegate :: didFinishLaunchingWithOptions.

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

bien sûr - vous devez importer RootViewController.h et créer la variable

voici un article de Nice à propos de RootViewController et de AppDelegate,

19
rémy

Assurez-vous d’avoir cette fonction dans votre délégué d’application.

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

Assurez-vous que didFinishLaunchingWithOptions renvoie YES. Si vous supprimez la ligne 'return YES', cela provoquera l'erreur. Cette erreur peut être particulièrement fréquente chez les utilisateurs de storyboard.

11
anticyclope

J'ai également eu cette erreur, mais contrairement aux réponses précédentes, la mienne était due au fait que je n'avais pas commenté la méthode 'loadView' dans mon contrôleur nouvellement généré (xcode 4.2, ios5).

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

Il m'a même dit que la méthode était utilisée pour créer la vue par programme, mais je l'ai manquée car elle ressemblait tellement à d'autres méthodes telles que viewDidLoad que j'utilise normalement mais je ne l'ai pas détectée.

Pour résoudre ce problème, supprimez simplement cette méthode si vous ne créez pas par programme la hiérarchie des vues à l'aide de nib ou de storyboard.

11
trcarden

j'ai aussi ces problèmes. J'ai eu mon projet exécuté dans xcode4.2.1. J'ai lu tous les commentaires là-haut, mais personne n'est cool pour moi. après un moment, je trouve que j'ai commenté un morceau de code.

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

alors je l'ai commenté. tout va bien pour moi. J'espère que cela vous sera utile.

11
Bruce Lee

Ma première vue étant MenuViewController j'ai ajouté:

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

sur la méthode App Delegate:

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

Ça a marché.

10
cujino

Il y avait un léger changement autour de iOS 5.0 ou à peu près, vous obligeant à avoir un contrôleur de vue racine. Si votre code est basé sur un exemple de code plus ancien, tel que GLES2Sample , aucun contrôleur de vue racine n'a été créé dans ces exemples de code.

Pour corriger (que GLES2Sample, par exemple), directement dans applicationDidFinishLaunching, je crée un contrôleur de vue racine et y attache ma 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
}

Cela fait disparaître l'avertissement et n'affecte pas vraiment votre application autrement.

10
bobobobo

Essayez de connecter IBOutlet du contrôleur de barre d’onglet à la vue racine dans Interface Builder au lieu de

self.window.rootViewController = self.tabBarController;

Mais en réalité je n'ai jamais vu une telle erreur auparavant.

9
d.lebedev

J'ai résolu le problème en procédant comme suit (aucune des solutions ci-dessus n'a aidé):

Dans le menu déroulant associé à "Interface principale", sélectionnez une autre entrée, puis sélectionnez de nouveau "MainWindow" puis reconstruisez.

enter image description here

8
RawMean

Je suis tombé sur le même problème mais j'utilisais storyboard

Assigner mon storyboardInitialViewController à la fenêtre rootViewController de ma fenêtre.

Dans

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

et cela a résolu le problème.

8
thesummersign

J'ai commencé à avoir ce même problème juste après la mise à niveau vers Xcode 4.3, et uniquement lorsque je démarrais un projet à partir de zéro (c'est-à-dire créer un projet vide, puis créer un UIViewController, puis créer un fichier nib séparé).

Après avoir mis TOUTES les lignes que j’avais utilisées et que j’avais les bonnes connexions, j’obtenais cette erreur et le fichier nib que je tentais de charger via le contrôleur de vue (défini comme rootController) n’a jamais été affiché dans le simulateur.

J'ai créé un modèle de vue unique via Xcode et je l'ai comparé à mon code. Enfin, j'ai trouvé le problème!

Xcode 4.3 semble ajouter par défaut la méthode void) loadView; à la section de mise en œuvre du contrôleur de vue. Après avoir lu attentivement les commentaires, le problème était devenu clair. Le commentaire indiquait de surcharger la méthode loadView si vous créez une vue par programme (et je paraphrase), sinon, PAS de surcharger loadView si vous utilisez un nib. Il n'y avait rien d'autre à l'intérieur de cette méthode, donc dans les faits, je surchargeais la méthode (et ne faisais rien) TOUT en utilisant un fichier nib, ce qui donnait l'erreur.

--- (La solution consistait soit à supprimer complètement la méthode loadView de la section implémentation, soit à appeler la méthode parent en ajoutant [super loadView].

Il serait préférable de le supprimer si vous utilisez un fichier NIB, car l'ajout de tout autre code le remplacera.

7
Raz

Si vous utilisez MTStatusBarOverlay, vous obtiendrez cette erreur.

MTStatusBarOverlay crée une fenêtre supplémentaire ([[UIApplication sharedApplication]]) qui ne possède pas de contrôleur racine.

Cela ne semble pas poser de problème.

6
Confused Vorlon

J'ai eu le même problème. Si vous construisez une application basée sur une fenêtre "à partir de zéro" comme je le faisais, vous devrez procéder comme suit: (notez qu'il s'agit d'étapes pour Xcode 4.2.)

. Assurez-vous que votre délégué d'application est conforme au protocole UIApplicationDelegate.

Par exemple, supposons que notre délégué s'appelle MyAppDelegate. Dans MyAppDelegate.h, nous devrions avoir quelque chose comme ceci:

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. Spécifiez le délégué de l'application dans main.m

Par exemple,

#import "MyAppDelegate.h"

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

2. Créez un fichier d'interface de fenêtre principale.

Pour ce faire, cliquez avec le bouton droit sur votre projet et choisissez Nouveau fichier. À partir de là, choisissez Fenêtre dans la section iOS -> Interface utilisateur.

Après avoir ajouté le fichier à votre projet, accédez au résumé du projet (cliquez avec le bouton gauche de la souris sur le projet; cliquez sur résumé.) Sous Infos de déploiement iPhone/iPod (et dans la section iPad correspondante si vous le souhaitez), sélectionnez votre nouveau fichier d'interface dans les " "Interface principale".

. Tout brancher dans l'éditeur d'interface

Sélectionnez votre fichier d'interface dans la liste des fichiers pour faire apparaître l'éditeur d'interface.

Assurez-vous que le volet Utilitaires est ouvert.

Ajoutez un nouvel objet en faisant glisser un objet de la liste Objets du volet Utilitaires vers l'espace situé au-dessus ou au-dessous de votre objet Window. Sélectionnez l'objet. Cliquez sur l'inspecteur d'identité dans le volet Utilitaires. Remplacez la classe par le délégué de l'application (MyAppDelegate, dans cet exemple).

Affichez l'inspecteur de connexions pour MyAppDelegate. Connectez la sortie de fenêtre à la fenêtre qui existe déjà dans le fichier d'interface.

Cliquez sur le propriétaire du fichier à gauche, puis cliquez sur l'inspecteur d'Identité dans le volet Utilitaires. Changez la classe en UIApplication

Affichez l'inspecteur de connexions pour le propriétaire du fichier. Connectez la sortie déléguée à l'objet MyAppDelegate.

4. Enfin et surtout, cliquez sur l'objet Window dans le fichier d'interface. Ouvrez l'inspecteur Attributs. Assurez-vous que l'option "Visible au lancement" est cochée.

C'est tout ce que je devais faire pour que cela fonctionne pour moi. Bonne chance!

6
Tom

A reçu la même erreur après avoir remplacé mon interface utilisateur par un Storyboard, à l'aide de XCode 4.6.3 et iOS 6.1

Résolu le problème en effaçant tout le code de didFinishLaucnhingWithOptions dans AppDelegate

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

J'ai eu ce même message d'erreur dans le journal. J'ai eu un UIAlertView pop-up dans l'application: didFinishLaunchingWithOptions. Je l'ai résolu en retardant l'appel à alertView pour laisser le temps au contrôleur de vue racine de terminer le chargement.

En application: didFinishLaunchingWithOptions:

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

qui appelle après 1 seconde:

- (void)callPopUp
{
    // call UIAlertView
}
6
janeway

OrdoDei a donné une réponse correcte et précieuse. J'ajoute cette réponse uniquement pour donner un exemple de méthode didFinishLaunchingWithOptions qui utilise sa réponse, ainsi que pour comptabiliser les commentaires des autres utilisateurs concernant Contrôleur de navigation.

- (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;
}
5
Basil Bourque

En plus de la réponse "sho", c'est correct (le quatrième paramètre de UIApplicationMain devrait être le nom du contrôleur principal), j'ajoute quelques commentaires.

J'ai récemment changé le "modèle" d'une de mes applications consistant à ne pas utiliser MainWindow.xib pour construire une fenêtre par programmation. L'application utilisait un ancien modèle qui créait automatiquement cette MainWindow. Étant donné que je souhaitais prendre en charge une autre vue de contrôleur XIB pour iPhone 5, il est plus facile de choisir le bon XIB par programme lors de la création du délégué d'applications. J'ai également supprimé MainWindow.xib du projet.

Le problème, c’est que j’ai oublié de renseigner le quatrième paramètre de UIApplication main et j’ai oublié de supprimer MainWindow de "Main Interface" dans Résumé du projet.

Cela a causé un gros problème: il a rendu l'avertissement inoffensif "Les applications sont censées ..." sur les périphériques de développement, mais lorsqu'il est allé sur App Store, il s'est cassé sur les téléphones grand public, plantant, car MainWindow n'était plus dans le paquet! Je devais demander un examen accéléré pour le correctif.

Un autre symptôme est que parfois un bloc blanc, comme un UIView vierge, apparaissait parfois lorsque les paramètres étaient changés et que l'application était mise au premier plan. Sur l'iPhone 5, il était clair qu'il s'agissait d'un bloc de 320x480. Peut-être que la MainWindow manquante était créée en mode développement, en utilisant l’ancienne taille. Je venais de trouver ce bogue lorsque les premiers rapports sur le crash sont arrivés dans la boîte de réception.

L'installation de l'application à partir de l'App Store plutôt que de XCode a montré que celle-ci s'était effectivement effondrée et que le problème de MainWindow s'était révélé dans le journal. Je pouvais donc voir qu'il ne s'agissait pas d'une combinaison spéciale de périphériques + versions d'IOS.

4
epx

J'ai été en mesure de définir le contrôleur de vue initial sur l'écran de synthèse de xcode.

Cliquez sur le nom du projet le plus en haut dans l'explorateur de fichiers de gauche (il devrait comporter une petite icône de plan directeur). Dans la colonne centrale, cliquez sur le nom de votre projet sous "CIBLES" (il devrait y avoir une petite icône en forme de crayon "A" à côté). Recherchez sous "Informations de déploiement iPhone/iPod" et recherchez "Interface principale". Vous devriez pouvoir sélectionner une option dans la liste déroulante.

4
RachelD

Pour ajouter à la réponse de Mike Flynn, depuis la mise à niveau vers Xcode 7 et l'exécution de mon application sur un périphérique iOS 9, j'ai ajouté cela à mon (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;
    }
}
4
Kevin_TA

Cela m'est arrivé parce que j'ai commenté par inadvertance:

[self.window makeKeyAndVisible];

de

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

Ce problème se produit lorsque Interface Builder n'est pas configuré correctement.

Assurez-vous que la fenêtre de votre délégué d'application et les prises viewController sont bien connectées:

Dans votre MainWindow.xib, maintenez le contrôle enfoncé, cliquez sur Délégué d'application et faites-le glisser jusqu'à l'objet Window. Sélectionnez une fenêtre. Maintenez le contrôle, sélectionnez à nouveau le délégué de l'application, faites-le glisser vers votre contrôleur de vue racine et sélectionnez viewController.

3
uranazo

Cette erreur s'affiche également lorsque le propriétaire du fichier MainWindow.xib est défini de manière incorrecte.

Le propriétaire du fichier est UIApplication
-> objet inséré de la classe déléguée de l'application avec une sortie de fenêtre connectée à une fenêtre

3
JakubKnejzlik

J'obtenais cette erreur (Applications are expected to have a root view controller at the end of application launch) et je créais les contrôleurs de vue par programme.

Résolu ce problème en vérifiant que la méthode loadView de mon contrôleur de vue racine appelait [super loadView].

3
coco

On dirait que self.tabBarController renvoie nil. tabBarController n'est probablement pas câblé dans Interface Builder. Définissez la IBOutlet de tabBarController sur tabBarController dans Interface Builder.

1
timthetoolman

Assurez-vous que votre "contrôleur de vue initial" est correctement défini pour votre première scène.enter image description here

C'est ce qui cause l'erreur.

1
Rasputin Jones

J'ai eu cette erreur aussi mais aucune réponse déjà inscrite ne résout mon problème. Dans mon cas, l'affichage du journal était dû au fait que j'assignais le contrôleur de vue racine d'application dans un autre sous-thread.

-(BOOL) application:(UIApplication*) application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
{
    ...
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        ...
        dispatch_async(dispatch_get_main_queue(), ^{
            ...
            [self updateTabBarTitles];
            self.window.rootViewController = self.tabBarController;
            ...
        });
    });

    [self.window makeKeyAndVisible];
    return YES;
}

En déplaçant l'affectation rootViewController à la fin de la fonction, juste avant l'appel de makeKeyAndVisible: - le message de journal ne s'affiche plus.

{
    ...
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

J'espère que ça aide.

1
Lisarien

Je me suis heurté à cela dans une application iPad ciblant iOS 5.1 dans Xcode 4.5.1. L'application utilise UITabBarController. J'avais besoin d'une nouvelle section dans le contrôleur de la barre d'onglets. J'ai donc créé un nouveau contrôleur de vue et xib. Une fois que j'ai ajouté le nouveau contrôleur de vue au contrôleur de la barre d'onglets, aucun de mes contrôles à l'écran ne fonctionnait plus et j'ai obtenu le journal "prévu pour avoir un contrôleur de vue racine".

D'une manière ou d'une autre, l'objet de niveau supérieur dans la nouvelle xib était UIWindow au lieu de UIView. Lorsque j'ai déposé un UIView dans XIB, que le point de sortie de la vue y était pointé, que toutes les sous-vues avaient été déplacées dans le nouveau UIView et que l'instance de UIWindow avait été supprimée, le problème a été résolu.

1
bneely

Bien que beaucoup de ces réponses semblent valables, aucune d’entre elles ne l’a corrigé pour moi. J'essayais avec le modèle d'application vide et essayais de charger directement dans un fichier .xib pour comprendre le bien (comme pour l'ancien modèle de fenêtre). Il semble que Apple a laissé un message NSLog en cours d'exécution.

J'étais sur Xcode 4.3 et rien ne semblait se débarrasser du message et je voulais savoir pourquoi. Enfin, j'ai décidé de voir ce qui se passerait dans Xcode 4.5 (version préliminaire/iPhone 6.0) et le message n’est plus là. Passer à autre chose.

1
Kyle Parisi

Cette erreur m'a frappé tout d'un coup. Alors, quelle en est la cause?

Il s’avère que j’étais dans IB en joignant File Owner à un nouveau petit ImageView que j'avais glissé dans la vue. Je ne l'avais pas appelé IBOutlet dans le fichier .h. Ainsi, lorsque je l'ai fait glisser tout en maintenant la touche Ctrl enfoncée, la nouvelle Imageview n'était pas répertoriée comme une connexion possible. La seule possibilité affichée dans la petite boîte noire était Afficher. J'ai dû cliquer, par inadvertance. J'ai fait quelques modifications, puis j'ai exécuté le programme et obtenu l'erreur du contrôleur racine. La solution permettait de reconnecter le propriétaire du fichier à la vue inférieure de l'écran xib-IB.

1
Rob Smythe

Cette solution Swift 2 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 aussi eu ce problème. Il s'avère que c'était lorsque j'ai supprimé le délégué d'application de la liste d'objets à gauche, j'ai supprimé la connexion pour le délégué d'application, la fenêtre et TabBarController :)

0
Will Larche

Déplacer setRootViewController: de didFinishLaunchingWithOptions: vers awakeFromNib: a résolu ce problème dans mon projet vide.

0
greg

Aucune de la réponse tout à fait résolu mon problème.

Je travaille sur un ancien projet iOS4 mis à niveau vers ARC et sur lequel je travaille maintenant dans Xcode 5 pour iOS 7.

Je les ai tous lus et j'ai commencé à vérifier ma configuration et mon code.

Ce qui l'a corrigé pour moi était l'ajout

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

En plus d'avoir

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
}

Je n'avais pas

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

avant d'obtenir l'erreur.

0
Megasaur

J'ai eu le même message d'erreur parce que j'ai appelé une alerte

- (void)applicationDidBecomeActive:(UIApplication *)application 

au lieu de

- (void)applicationWillEnterForeground:(UIApplication *)application
0
JScarry

Aucune des solutions ci-dessus n'a fonctionné pour moi ... j'ai découvert un problème avec ma méthode init sur mon appDelegate. Si vous implémentez la méthode init, assurez-vous de le faire correctement

j'ai eu ceci:

- (id)init {
    if (!self) {
        self = [super init];
        sharedInstance = self;
    }
    return sharedInstance;
}

et l'a changé en ceci:

- (id)init {
    if (!self) {
        self = [super init];
    }
    sharedInstance = self;
    return sharedInstance;
}

où "sharedInstance" est un pointeur sur mon singleton appDelegate

0
user2387149

Dans mon cas, tout ce qui concernait la fenêtre et la méthode didFinishLaunchingWithOptions: était satisfaisant.

Mon erreur était que je n'avais pas réalisé que applicationDidBecomeActive: s'exécutait au démarrage en plus du moment où l'application revenait au premier plan après avoir été à l'arrière-plan.

Par conséquent, dans applicationDidBecomeActive:, je manipulais des contrôleurs de vue qui n’avaient pas encore terminé leur configuration (en attente de réponse de différents threads, etc.).

Une fois que j'ai déplacé cette fonctionnalité en dehors de applicationDidBecomeActive, les erreurs ont disparu.

0
Noah Dyer

Si votre application remplace la principale UIWindow par FingerTipWindow (pour afficher les touches d'un projecteur) et que vous n'avez pas mis à jour vos sources depuis quelques années, votre objet de remplacement risque de ne pas inclure de propriété rootViewController (voir kgn's 5/21/2013 mod à GitHub )

Vous pouvez définir window.rootViewController dans didFinishLaunchingWithOptions jusqu'à ce que les vaches rentrent à la maison, mais votre fenêtre n'en signalera pas un "à la fin du lancement de l'application" et lèvera une exception lors de l'exécution. Mettez à jour vos sources.

0
Jeff

J'étais en train de migrer un ancien projet exemple EAGLView vers le nouveau projet exemple GLKView dans Xcode 4 et aucune des solutions ne fonctionnait pour moi. Enfin, j'ai réalisé que j'essayais de définir l'auto.view du GLKViewController principal pour qu'il pointe vers un GLKView imbriqué dans Interface Builder.

Lorsque j'ai redirigé l'auto-vision vers la racine de GLKView dans Interface Builder, mon application a ensuite pu être lancée sans message d'erreur (assurez-vous donc que la vue de votre contrôleur de vue est définie sur la vue racine).

P.S. Si vous souhaitez faire fonctionner un GLKView imbriqué, créez une nouvelle variable membre telle que self.glkSubview dans ViewController.h et faites glisser sa connexion vers le GLKView imbriqué dans Interface Builder. Ensuite, assurez-vous de faire glisser le délégué de self.glkSubview vers le propriétaire du fichier. Vous devez appeler manuellement [self.glkSubview display] dans "- (void) glkView: (GLKView *) view drawInRect: (CGRect) rect" si vous avez setNeedsDisplay désactivé pour GLKView.

0
Zack Morris

Avez-vous essayé de définir le délégué, c.-à-d.

self.rootController.delegate = self;

dans l'applicationDidFinishLaunchingWithOptions? Cela a fonctionné pour moi, bien que je ne sache pas pourquoi.

0
beaudrykock

pour le changement d'ARC:

changer à

@synthesize window;

au lieu de

@synthesize window=_window;
0
Eric