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

383

J'obtiens l'erreur suivante dans ma console:

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

Voici ma application:didFinishLaunchWithOptionsméthode:

- (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 UITabBarControllerdélégué de est connecté au délégué d'application.

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

ArtSabintsev
la source
5
Effectuez un NSLog de self.tabBarController juste avant de faire l'affectation. Le message n'est déclenché que si le contrôleur est nul. S'il est nul et que vous vous êtes assuré que vos connexions sont correctes, essayez d'instancier le contrôleur dans le code.
FeifanZ
essayez de commenter l'initialisation de la fenêtre .. vérifiez cette réponse stackoverflow.com/a/33958144/1293445
mohammad alabid

Réponses:

188

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");
sho
la source
49
Une autre option consiste à s'assurer que la classe déléguée de l'application est importée dans main et use NSStringFromClass. C'est ainsi que Xcode crée maintenant le fichier main.m. Par exemple: #import "AppDelegate.hpuisint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho
10
assurez-vous qu'il self.windowest initialisé commeself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor
1
J'ai essayé les options ci-dessus, ne fonctionnait pas pour moi. Et je n'utilise pas de Storyboard.
jowie
3
N'a eu aucun effet pour moi, le même message "Des applications sont attendues ..." après avoir fait le changement. La solution était la réponse d'OrdoDei (voir ci-dessus ou ci-dessous) qui fonctionnait parfaitement.
Andrew
1
Si vous voyez une vue blanche dans le simulateur mais que vous vous attendez à voir la mise en page à partir d'un storyboard, assurez-vous que vous vous êtes débarrassé du code dans votre fonction de délégué racine "application didFinishLaunchingWithOptions ..." qui est pointée dans main.m et n'a que "return" OUI;" en elle.
Olivier de Jonge
435

Remplacer dans AppDelegate

 [window addSubview:[someController view]];

à

  [self.window setRootViewController:someController];
OrdoDei
la source
Cela m'a débarrassé du message. Il ne montre toujours pas de fenêtre ultérieure, mais cela peut être un problème différent. Merci.
Jazzmine
3
Si vous utilisez un UINavigationController, vous devez d'abord [[UINavigationController] initWithRootViewController: tableViewController] puis utiliser le code ci-dessus [self.window setRootViewController: self.navigationController] pour définir le contrôleur de vue racine de la fenêtre
emdog4
Cocos2d a un commentaire qui dit "// AddSubView ne fonctionne pas sur iOS6" Donc cela l'a corrigé pour moi, car j'utilise iOS 6.
Almo
1
La addSubviewligne faisait partie du modèle de projet sur une première version du SDK Xcode / iOS. Si l'application remonte à loin, vous pouvez l'avoir même si vous ne l'avez pas écrite.
Seva Alekseyev
bonjour je reçois ce eroor: - *** Échec d'assertion dans - [UIApplication _runWithMainScene: transitionContext: complétion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:: 3294 comment résoudre ce problème
Akash Raghani
70

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, alors je l'ai réduite et j'ai découvert ce qui n'allait pas. Il s'avère que j'essayais de changer l'affichage d'une vue avant qu'elle n'apparaisse réellement à l'écran. La solution était donc de déplacer ce code dans le viewcontroller qui me posait des problèmes

- (void)viewDidLoad

à

- (void)viewDidAppear:(BOOL)animated

et l'erreur a cessé d'apparaître. Mon problème a été spécifiquement causé en faisant unUIAlertView spectacle.

Dans votre cas, je vous suggère de vérifier 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épart dans le fichier nib au lieu de dans le code - ou si vous voulez le faire dans le code, essayez de déplacer le code vers la méthode appropriée de tabBarController active viewcontroller.

Bonne chance!

Warkst
la source
1
Warkst, merci pour la réponse. Dans mon cas, je ne peux pas déplacer le code viewDidLoad:(sans ajouter d'indicateur), et je ne devrais pas avoir à le faire. Quoi qu'il en soit, merci pour la suggestion!
ArtSabintsev
2
J'ai trouvé cela aujourd'hui et heureux de l'avoir fait - même problème - montrait à un uialert un lancement dans viewDidLoad. Changé pour viewDidAppear et fonctionne très bien. Je ne sais pas ce que Apple fait de mieux en changeant cela dans iOS5.
GuybrushThreepwood
Merci d'avoir suggéré que la vue d'alerte était à l'origine de ce problème, ce même problème m'est également arrivé.
Chris
1
Pourriez-vous nous dire quel code vous avez dû supprimer pour le trier? J'utilise mon viewDidLoadpour beaucoup de choses, en configurant toutes les choses pour la première fois, comme l'ajout de données au UITableView. Je ne peux pas le déplacer viewDidAppear:car je ne veux qu'il se déclenche qu'une seule fois.
jowie
1
Le problème n'était pas la mauvaise fonction. Le problème était que vous oubliez d'appeler [super viewDidLoad] dans votre fonction viewDidLoad, tuant ainsi efficacement la charge de la plume. La même chose m'est arrivée plus d'une fois.
Borrrden
47

Je l'ai obtenu en commençant par le modèle "Application vide" et en ajoutant manuellement un 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 est la suppression

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

de

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

Comme il va écraser 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 câblé avec votre fenêtre et votre délégué d'application dans le fichier XIB.

jlujan
la source
Cela m'a également arrangé. J'utilisais une application à onglets avec un Storyboard auquel j'essayais d'ajouter CoreData et j'ai rencontré ce problème.
gitaarik
lol si j'ajoute ceci, j'obtiens deux avertissements que les fenêtres d'application devraient avoir un contrôleur de vue racine !!
George Asda
46

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 vous aidera.

entrez la description de l'image ici

Ensoleillé
la source
2
Cela a fonctionné pour moi! Cela fonctionne lorsque vous créez un projet vide dans Xcode 4.2, où aucun MainWindow ne sera présent et c'est ainsi que nous devons le brancher.
jeevangs
Le problème pour nous s'est produit lorsque, par inadvertance, nous avons supprimé la ligne «Nom de la base du fichier nib principal» du fichier «Info.plist». L'insertion à nouveau de cette ligne a résolu le problème.
rtovars
Vous pouvez également définir cela dans les propriétés du projet. Sélectionnez le projet, votre cible, vous pouvez le modifier dans Résumé -> Informations de déploiement iPhone / iPad.
doekman
ce fut en fait le problème pour moi, conduisant à plusieurs problèmes liés à l'appel de viewDidLoad et viewWillAppear deux fois sur rootViewController. Dans mon cas, supprimer cela était la solution
whyoz
27

J'ai rencontré le même problème récemment, lors de la construction d'un projet avec ios5 sdk. Au début, il se construisait et fonctionnait correctement, mais après cela, l'erreur est apparue.
Dans mon cas, la solution était plutôt simple.
Ce qui manquait, c'était que l' interface principale propriété de l' dans l'onglet récapitulatif de ma cible d'application avait été effacée. J'ai donc dû le régler à nouveau.


Si ce n'est pas le cas, et si tabBarController est toujours nul, vous pouvez toujours créer par programmation votre fenêtre et votre contrôleur racine. En guise de 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.

denicija
la source
24

J'ai mis à niveau vers 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;
    }
}
Mike Flynn
la source
Je suis curieux de savoir combien de fenêtres votre application avait et si toutes avaient un contrôleur de vue racine. Merci
DrAL3X
5
Remarque : cette réponse est une solution de contournement et ne résout pas la cause racine. Voir stackoverflow.com/a/33958144/1116061
lipka
Vous etes un vrai hero!
user2161301
21

Aucune des suggestions ci-dessus n'a résolu mon problème. La mienne était la suivante:

Ajouter:

window.rootViewController = navigationController;

après:

[window addSubview:navigationController.view];

dans mon appdelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
RyeMAC3
la source
20
  • Sélectionnez votre "fenêtre" dans votre fichier Nib
  • Dans "Inspecteur des attributs", cochez "Visible au lancement"

image![]

  • Cela se produit lorsque votre fichier nib est créé manuellement.
  • Ce correctif fonctionne pour le mode plume normal - pas le mode storyboard
4 tours
la source
Cela ne se trouve que dans le mode Storyboard, je pense.
ArtSabintsev
Non, ce projet était en mode plume normal. Ceci est une capture d'écran du mode Storyboard. "Visible au lancement" contre "Est le contrôleur de vue initial".
bearMountain
3
Si le fichier nib de fenêtre créé manuellement et "visible au lancement" n'est pas coché par défaut, ce message s'affichera après le lancement de l'application, cela résoudra mon problème!
ZYiOS
OH MERCI!!! Enfin, une solution à cet avertissement ennuyeux. Même si vous l'avez, makeKeyAndVisiblecela ne résout pas le problème. SEULEMENT cela a résolu l'avertissement pour moi. MERCI!
tacos_tacos_tacos
«Cela se produit en mode normal nib - pas en mode storyboard» Pas très vrai. Je suis confronté à la même question avec Storyboardaussi
thesummersign
19

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 le UIViewController subclass nommer RootViewController , décochez l'interface With XIB pour l'utilisateur (en supposant que vous en avez déjà un) et placez ce code dans votre AppDelegate :: didFinishLaunchingWithOptions

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

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

voici un bel article sur le RootViewController et l'AppDelegate,

rémy
la source
Le lien vers l'article de cupsofcocoa.com est mort - une idée s'il y a une copie quelque part?
Ríomhaire
1
cela a été déplacé vers binpress.com, a mis à jour le lien dans la réponse
rémy
Voilà un excellent lien. Bonne lecture et explique ce qui se passe. Je viens de rencontrer ce problème également en utilisant un vieux livre (car je veux d'abord apprendre Objective-C) mais en écrivant du code sur le dernier XCode 7, qui n'a pas les anciens modèles.
ibaralf
11

J'ai également eu cette erreur, mais contrairement à l'une des réponses précédemment énumérées, la mienne était parce que j'avais dé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 pour créer la vue par programme mais je l'ai manquée car elle ressemblait tellement à d'autres méthodes comme viewDidLoad que j'utilise normalement, je ne l'ai pas capturée.

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

trcarden
la source
Je peux confirmer que cela peut provoquer le problème. J'ai eu la même situation en suivant le tutoriel sur TableView où ils créent définir les délégués dans loadView. Après avoir déplacé ce code vers viewDidLoad et supprimé le loadView, tout a commencé à fonctionner selon les besoins.
Eugen
Vous pouvez toujours utiliser la vue de chargement mais ajouter [super loadView]; à ses débuts.
Hermann Klecker
1
Hmm ... la documentation de loadView indique spécifiquement que vous ne devez pas appeler la super méthode.
Joshua Sullivan
J'ai surchargé l'UIViewController par défaut dans un storyboard et j'ai constaté que le code de modèle pour créer une sous-classe UIViewController a activé LoadView par défaut, ce qui m'a causé ... gaspillé plus d'une heure sur cette chose idiote. Merci d'avoir posté ça!
slycrel
11

j'ai aussi eu ces problèmes. j'ai fait exécuter mon projet dans xcode4.2.1. j'ai lu tous les commentaires là-haut, mais personne n'est cool pour moi. après un certain temps, 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.

Bruce Lee
la source
Le code: "self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];" provoquer une erreur, donc je viens de le supprimer.
Grigori A.
11

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 OUI. Si vous supprimez la ligne 'return YES', cela provoquera l'erreur. Cette erreur peut être particulièrement courante avec les utilisateurs du storyboard.

anticyclope
la source
beaucoup de félicitations, c'est ce que je voulais (projet vide avec storyboard)
Shtirlic
2
Pareil ici. Merci. Si vous créez une application vide, cette méthode est remplie de création manuelle de la fenêtre. Cela devrait être changé pour retourner simplement OUI. Thx
Ben G
10

Avec ma première vue, MenuViewControllerj'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é.

cujino
la source
10

Il y avait un léger changement autour d'iOS 5.0 ou plus, 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 (ce GLES2Sample, par exemple), directement 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.

2 tours
la source
9

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

self.window.rootViewController = self.tabBarController;

Mais en fait, je n'ai jamais vu une telle erreur auparavant.

d.lebedev
la source
8

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

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

entrez la description de l'image ici

RawMean
la source
8

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

Affecter mon storyboard InitialViewControllerà ma fenêtrerootViewController .

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.

le signe
la source
7

J'ai commencé à avoir ce même problème juste après la mise à niveau vers Xcode 4.3, et uniquement lors du démarrage d'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 auxquelles j'étais habitué et m'être assuré d'avoir les bonnes connexions, j'ai continué à obtenir cette erreur, et le fichier nib que j'essayais de charger via le contrôleur de vue (qui a été défini comme rootController) ne s'est jamais affiché dans le simulateur.

J'ai créé un modèle de vue unique via Xcode et je l'ai comparé à mon code et j'ai finalement 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 à l'intérieur, il est devenu clair quel était le problème. Le commentaire indiquait de remplacer la méthode loadView si vous créez une vue par programme (et je paraphrase), sinon de ne PAS remplacer loadView si vous utilisez une pointe. Il n'y avait rien d'autre à l'intérieur de cette méthode, donc en fait, je remplaçais la méthode (et je ne fais rien) EN UTILISANT un fichier nib, ce qui a donné l'erreur.

La SOLUTION consistait soit à supprimer complètement la méthode loadView de la section d'implémentation, soit à appeler la méthode parente en ajoutant [super loadView].

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

Raz
la source
c'était exactement mon problème! J'avais ajouté une implémentation loadView mais je n'ai pas appelé super. A fait d'autres changements de code, je ne me souviens pas de ce que j'ai fait. Je suis resté coincé pendant 2 heures parce que ce changement semblait si anodin.
LearnCocos2D
6

J'ai eu ce même message d'erreur dans le journal. J'ai eu un pop-up UIAlertView dans l'application: didFinishLaunchingWithOptions. Je l'ai résolu en retardant l'appel à l'alerteView 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
}
janeway
la source
Merci, cela a résolu mon problème. Vous devez attendre pour afficher l'alerte jusqu'à ce que la fenêtre soit chargée. Dans mon cas, je viens de faire [alert performSelector: @selector (show) withObject: nil afterDelay: 1.0];
deepwinter
6

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 l'étais, vous devrez faire ce qui suit: (notez que ce sont des étapes pour Xcode 4.2.)

0. 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é d'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. 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 le résumé). Sous iPhone / iPod Deployment Info (et la section iPad correspondante si vous le souhaitez) et sélectionnez votre nouveau fichier d'interface dans le " Zone de liste déroulante Interface principale ".

3. Accrochez le tout 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 au-dessus ou en 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.)

Ouvrez 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 sur la gauche, puis cliquez sur l'inspecteur d'identité dans le volet Utilitaires. Changez la classe enUIApplication

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

4. Enfin, et c'est très important, cliquez sur l'objet Window dans le fichier d'interface. Ouvrez l'inspecteur des attributs. Assurez-vous que "Visible au lancement" est coché.

C'est tout ce que j'avais à faire pour que ça marche pour moi. Bonne chance!

À M
la source
6

Si vous utilisez MTStatusBarOverlay, vous obtiendrez cette erreur.

MTStatusBarOverlay crée une fenêtre supplémentaire (fenêtres [[UIApplication sharedApplication]) qui n'a pas de contrôleur racine.

Cela ne semble pas poser de problème.

Vorlon confus
la source
Êtes-vous sûr de cela? L'avez-vous testé?
Sergey Grischyov
Je suis sûr que cela crée une fenêtre et je suis sûr que cela ne crée pas de problème dans mes applications.
Confused Vorlon
Vous pouvez définir un VC factice sur le MTStatusBarOverlay pour le corriger.
Wesley
C'était exactement mon problème. J'ai eu un type de configuration similaire avec une fenêtre qui a été ajoutée pour une barre de notification, et une fois que j'ai commenté cela, l'erreur a disparu! Il semble être inoffensif dans ce cas.
Aaron Zinman
6

Reçu la même erreur après avoir remplacé mon interface utilisateur par un Storyboard, en utilisant XCode 4.6.3 et iOS 6.1

Résolu en effaçant tout le code de didFinishLaucnhingWithOptions dans l'AppDelegate

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

OrdoDei a donné une réponse correcte et valable. J'ajoute cette réponse uniquement pour donner un exemple d'une didFinishLaunchingWithOptionsméthode qui utilise sa réponse et tient compte des commentaires des autres concernant le 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;
}
Basil Bourque
la source
4

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

[self.window makeKeyAndVisible];

de

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

J'ai pu définir le contrôleur de vue initial sur l'écran de résumé de xcode.

Cliquez sur le nom du projet le plus haut dans l'explorateur de fichiers de gauche (il devrait avoir une petite icône de plan). Dans la colonne centrale, cliquez sur le nom de votre projet sous «CIBLES» (il devrait avoir une petite icône «A» au crayon à côté). Regardez sous «iPhone / iPod Deployment Info» et recherchez «Main Interface». Vous devriez pouvoir sélectionner une option dans le menu déroulant.

RachelD
la source
4

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 en utilisant MainWindow.xib pour construire une fenêtre par programmation. L'application a utilisé un modèle plus ancien qui créait automatiquement 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 programmation lors de la création du délégué d'application. J'ai également supprimé MainWindow.xib du projet.

Le problème était, j'ai oublié de remplir le quatrième paramètre dans UIApplication main et j'ai OUBLIÉ DE SUPPRIMER MainWindow de "Interface principale" au Résumé du projet.

Cela a provoqué un GRAND problème: cela a rendu l'avertissement inoffensif "Les applications devraient ..." sur les appareils de développement, mais quand il est allé sur l'App Store, il s'est cassé sur les téléphones grand public, se bloquant parce que MainWindow n'était plus dans le bundle! J'ai dû demander une révision accélérée du correctif.

Un autre symptôme est que parfois un bloc blanc, comme une UIView vierge, apparaissait parfois lorsque les paramètres étaient modifiés et que l'application était mise au premier plan. Dans l'iPhone 5, il était clair qu'il s'agissait d'un bloc de 320 x 480. Peut-être que la MainWindow manquante était en cours de création en mode développement, en utilisant l'ancienne taille. Je venais de trouver ce bogue lorsque les premiers rapports du crash ont atteint la boîte de réception.

L'installation de l'application à partir de l'App Store au lieu de XCode a montré que l'application s'est effectivement bloquée, et le problème MainWindow s'est révélé dans le journal, donc je pouvais voir qu'il ne s'agissait pas d'une combinaison spéciale d'appareils + versions IOS.

epx
la source
4

Pour ajouter à la réponse de Mike Flynn, depuis la mise à niveau vers Xcode 7 et l'exécution de mon application sur un appareil iOS 9, j'ai ajouté ceci à 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;
    }
}
Kevin_TA
la source
Je suis curieux de savoir combien de fenêtres votre application avait et si toutes avaient un contrôleur de vue racine. Merci
DrAL3X
3

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

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

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

uranazo
la source
3

Cette erreur apparaît également lorsque le propriétaire du fichier de MainWindow.xib n'est pas défini correctement.

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

JakubKnejzlik
la source
J'ai créé un fichier xib manuellement et j'ai commencé à obtenir cette erreur. merci beaucoup!
RawMean