iOS 7 - Échec de l'instanciation du contrôleur de vue par défaut

93

J'utilise Xcode 5 dans une application nouvellement créée et quand je viens de la créer, je vais sur le bouton d'exécution et clique dessus, puis le projet est construit mais il ne s'affiche pas dans le simulateur iOS et je reçois le message suivant:

 Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - 
 perhaps the designated entry point is not set?

J'ai bien sûr googlé à ce sujet et tout le monde souligne que cela se produit parce que XCode ne sait pas encore quel contrôleur de vue est le contrôleur initial. Mais ce qui est étrange, c'est que j'ai créé l'application en tant qu'application basée sur une page (également essayé les options d'application à vue unique et à onglets) et XCode avait déjà défini un Storyboard pour cela.

De plus, lorsque je vais à l'option d'interface principale du projet, le storyboard (nommé "Main" par Xcode lui-même) est défini, et dans le Storyboard, mon contrôleur de vue est défini comme "Contrôleur de vue initiale"

entrez la description de l'image ici

Qu'est-ce qui ne va pas?

rodrigoalvesvieira
la source
essayez de le définir par programme ...
Shamsudheen TK
@Ramshad Salut, je suis une sorte de débutant dans le développement iOS. Comment puis je faire ça?
rodrigoalvesvieira
2
Assurez-vous de définir le contrôleur de vue comme contrôleur de vue initial.
Sandeep
Comme l'a souligné Kashif Ahmed, vous devez également ouvrir votre fichier Info.plist en tant que code source et éditer la chaîne <key> UISceneStoryboardFile </key> et y fournir le nom de votre nouveau storyboard.
bogdan

Réponses:

56

Donc, cela m'est aussi arrivé. J'ai vérifié 50 fois et mon "Is Initial View Controller" a été vérifié, croyez-moi. C'est arrivé à l'improviste. Alors, comment ai-je résolu le problème?

  1. Créez un nouveau storyboard dans votre projet, nommez-le quelque chose comme Main_iPhoneV2 (ou iPadV2 en fonction de votre style de storyboard d'origine)
  2. Ouvrez le storyboard cassé, cliquez n'importe où dans la zone blanche et appuyez sur commande-a, puis commande-c (tout sélectionner et copier)
  3. Ouvrez votre nouveau storyboard et appuyez sur commande-v pour coller la même configuration exacte
  4. Accédez aux paramètres de votre projet, modifiez votre "Interface principale" sur la nouvelle Main_iPhoneV2 (si c'est votre iPad et que vous écrivez une application universelle, vous devrez modifier le -Info.plist et rechercher la valeur "Fichier de storyboard principal nom de base (iPad)
  5. Recompilez et arrêtez de vous arracher les cheveux
Ryna
la source
3
rencontré le même problème en essayant les étapes répertoriées dans les principes de base du développeur. Créer un nouveau storyboard, marquer le nouveau comme contrôleur de vue initial et définir le nouveau comme storyboard principal via les informations de déploiement de projets. Cela a commencé à fonctionner comme par magie. Je ne sais pas si c'est un bug avec Xcode. developer.apple.com/library/ios/referencelibrary/GettingStarted/…
ioWint
Cela n'a pas fonctionné ou je crois que cela ne fonctionnera pas, à moins que et jusqu'à ce que le contrôleur de navigation initial soit défini comme "is Inital View Controller".
Sumit Kumar Saha
J'allais essayer ça. Mais ensuite j'ai nettoyé et reconstruit et cela a fonctionné
Skywalker
305

Vérifiez le contrôleur de vue initial dans l'inspecteur d'attributs.

entrez la description de l'image ici

Ashvin Ajadiya
la source
Bien sûr, c'est «ainsi que cela devrait fonctionner». Mais j'ai également rencontré le «bug», et cela ne fonctionne pas. Créer un nouveau et copier tous vos trucs a fonctionné! dans mon cas.
Tys
Mais son contrôleur de vue est déjà défini comme contrôleur de vue initiale, n'est-ce pas?
Iurii Vasylenko
@YuraVasylenko: Ce n'était pas avant, donc j'ai indiqué par marque comme sélectionné.
Ashvin Ajadiya
1
Juste pour le rendre un peu plus détaillé pour ceux qui en ont besoin, Définition du contrôleur initial pour un storyboard
Sergei Basharov
40

Cliquez d'abord sur View Controller dans la barre Utilitaires de droite . Ensuite, sélectionnez l' inspecteur d'attributs et assurez-vous que sous la section Contrôleur de vue, la case à cocher 'Est-ce que contrôleur de vue initial' est cochée!

Andy
la source
1
C'était mon problème. J'ai supprimé le contrôleur de vue par défaut de mon storyboard et lorsque j'en ai ajouté un autre, j'ai dû le vérifier.
Orgmir
17

Cet avertissement est également signalé si vous avez du code comme:

    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = myAwesomeRootViewController
    window?.makeKeyAndVisible()

Dans ce cas, accédez à la première page des paramètres cibles et définissez-la Main Interfacesur vide, car vous n'avez pas besoin d'une entrée de storyboard pour votre application.

superarts.org
la source
14

Utilisation d'Interface Builder:

Vérifiez si « Est le contrôleur de vue initial » est défini. Vous pouvez le configurer en utilisant les étapes ci-dessous:

  1. Sélectionnez votre contrôleur de vue (qui doit apparaître comme écran initial).
  2. Sélectionnez l' inspecteur d'attributs dans la fenêtre Utilitaires .
  3. Sélectionnez ' Is Initial View Controller ' dans la section View Controller (sinon).

Si vous avez effectué cette étape et que vous obtenez toujours une erreur, uncheck and do it again.

Étapes pour résoudre le problème

Utilisation par programme:

Objectif c :

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

        return YES;

Rapide :

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true
Jayprakash Dubey
la source
3
Si vous le faites par programme, assurez-vous de supprimer votre storyboard de l'interface principale de votre cible - laissez-le vide. Cela devrait également entrer didFinishLaunchingWithOptions.
Jordan H
@JordanH comment supprimer le storyboard de l'interface principale des cibles?
PascalS
@Passe Sélectionnez le texte et appuyez sur Supprimer, il est dans l'onglet Général
Jordan H
12

J'ai vécu cela avec mon contrôleur de barre d'onglets n'apparaissant pas dans le simulateur avec un écran noir. J'ai fait ce qui suit pour que mon application apparaisse dans le simulateur.

  1. Accédez à Main.storyboard.
  2. Vérifiez le Is Initial View Controllersous l'onglet Inspecteur d'attributs.

Est le contrôleur de vue initial dans l'inspecteur d'attributs.

Contre Bulaquena
la source
10

Configurer la fenêtre manuellement,

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (!application.keyWindow.rootViewController) 
     {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *myViewController= [storyboard instantiateViewControllerWithIdentifier:@"myViewController identifier"];

         application.keyWindow.rootViewController = myViewController;
     }
}
Shamsudheen TK
la source
Cela nécessite-t-il de décocher le contrôleur de vue initial dans le storyboard?
bdv
7

J'obtiens cette erreur lorsque je change le nom du fichier du storyboard " Main.storyboard " EN: " XXX.storyboard "

La solution pour moi était:

  • Produit-> Nettoyer
  • CHANGEMENT: Fichiers de support -> info.plist -> Nom de base du fichier de storyboard principal -> Principal TO: XXX

Bonne chance

Hovanes Mosoyan
la source
3

Le produit "Clean" était la solution pour moi.

Walter Schurter
la source
3

entrez la description de l'image ici

Outre la bonne réponse ci-dessus, assurez-vous également que vous avez défini la bonne interface principale en général.

Naren
la source
3

1ère option

si vous souhaitez définir votre storyboard personnalisé au lieu d'un contrôleur de vue par défaut.

Changer cet attribut du fichier info.plist

<key>UISceneStoryboardFile</key> <string>Onboarding</string>

L'intégration serait le nom de votre storyboard

pour ouvrir ce fichier, cliquez avec le bouton droit sur info.plist et ouvrez en tant que code source

2ème option

1- Cliquez sur votre projet

2- Sélectionnez votre projet dans la section cible

3- Déplacer vers la section de l' interface de déploiement

4- Changez la section de votre storyboard à partir du champ Interface principale

N'oubliez pas de définir le contrôleur de vue initiale de votre storyboard

Kashif Ahmed
la source
1
Le problème <key> UISceneStoryboardFile </key> l'a corrigé pour moi. Merci.
bogdan
2

Si vous avez ajouté un nouveau storyboard, vous devez vérifier les points suivants.

1) Dans votre fichier plist, vérifiez que la valeur du nom de base du fichier de storyboard principal (iPad) ou (iPhone) doit correspondre au nom de votre fichier de storyboard ( n'ajoutez pas l'extension .storyboard )

2) Dans le storyboard, il devrait y avoir un contrôleur de vue défini comme contrôleur de vue initial

3) Nettoyez et construisez votre projet. :)

entrez la description de l'image ici

Sachin Nikumbh
la source
1

Si vous avez régulièrement soumis votre code au contrôle de code source, cela peut vous éviter de créer un nouveau Storyboard et éventuellement d'introduire plus de problèmes ...

J'ai pu résoudre ce problème en comparant le code source Git de la version qui fonctionnait avec la version cassée. Le diff a montré que la première ligne devait contenir l'ID du contrôleur de vue initial, dans mon cas, initialViewController = "Q7U-eo-vxw" . J'ai cherché dans le code source pour m'assurer que l'identifiant existait. Tout ce que j'avais à faire était de le remettre et tout fonctionnait à nouveau!

<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="Q7U-eo-vxw">
    <dependencies>
        <deployment defaultVersion="1296" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
    </dependencies>
    <scenes>

Voici quelques étapes qui peuvent vous aider à résoudre les problèmes:

  1. Cliquez avec le bouton droit sur le Storyboard défaillant et utilisez Contrôle de la source> Valider ... pour conserver vos modifications depuis la dernière validation.
  2. Essayez de faire un clic droit sur votre storyboard défaillant et utilisez "Ouvrir en tant que> Code source" pour afficher le XML du storyboard.
  3. Dans l' élément de document , recherchez l'attribut nommé " initialViewController ". S'il manque, ne vous inquiétez pas, nous réglerons ce problème. S'il est là, double-cliquez sur l'id qui lui est assigné, commande-c pour le copier, commande-f commande-v pour le rechercher plus profondément dans le document. Il s'agit de l'identifiant du contrôleur qui doit fournir la vue initiale. S'il n'est pas défini dans le document, c'est un problème - vous devez le supprimer de la balise de document, dans mon cas initialViewController = "Q7U-eo-vxw" .
  4. Accédez à l'élément de menu Xcode appelé Affichage et choisissez Éditeur de version> Afficher la vue de comparaison
  5. Cela montre votre version locale à gauche et la version historique à droite. Cliquez sur la date sous la version historique pour obtenir une liste des commits pour ce storyboard. Choisissez celui que vous savez fonctionné et comparez l' élément de document . Quel est l'identifiant du * initialViewController ? Est-ce différent? Si tel est le cas, essayez de le modifier manuellement et exécutez. outil de comparaison historique de xcode en action
neoscrire
la source
1

Vérifiez si vous avez la variable window dans AppDelegate.

var window: UIWindow? 

Et vérifiez également le storyboard de votre fichier Info.plist.

<key>UIMainStoryboardFile</key>
<string>Main</string>

La définition par programme de rootViewController dans AppDelegate ne résoudra pas l'avertissement. Vous devez choisir de laisser le storyboard définir le contrôleur de vue ou de le faire par programme.

rockdaswift
la source
1

Les projets créés dans Xcode 11 et au-dessus, il ne suffira pas de modifier simplement le fichier de l'interface principale à partir des paramètres du projet.

Vous devez modifier manuellement le fichier Info.plist et définir également le nom du storyboard pour le UISceneStoryboardFile.

Isuru
la source
1

Aucune de ces réponses n'a résolu le problème pour moi. Dans mon cas, il ne définissait pas également le bon manifeste de scène d'application.

J'ai dû changer LoginScreen pour être principal

entrez la description de l'image ici

Julian Silvestri
la source
Surpris, cela n'a pas obtenu autant de votes. Cela se produira dans pratiquement n'importe quelle implémentation SceneDelegate (qui n'utilise pas Storyboard comme contrôleur initial).
bauerMusic Il y a