Xcode: "La scène est inaccessible en raison du manque de points d'entrée" mais ne la trouve pas

89

Xcode 4.5.2 me donne l'avertissement suivant:

Unsupported Configuration    
Scene is unreachable due to lack of entry points and does not have an identifier 
for runtime access via -instantiateViewControllerWithIdentifier:.

Malheureusement, je ne peux pas identifier la scène incriminée. La sélection de l'avertissement dans le navigateur de problèmes ne met rien en évidence dans le storyboard. J'ai un storyboard assez compliqué (plus de 30 scènes).

Aucune suggestion?

Capture d'écran d'avertissement

Wolfy
la source

Réponses:

50

Bien que ce fil soit ancien, je n'ai pas vu de réponse décrivant ce qui a fonctionné pour moi, alors voici ...

J'ai eu cette erreur et un examen visuel du storyboard a montré que tous les contrôleurs de vue semblaient être connectés au contrôleur de vue racine.

J'ai essayé de nommer les 17 contrôleurs de vue dans le storyboard (comme dans la réponse de @ bobnoble). J'ai utilisé une convention de dénomination basée sur le nom long du contrôleur de vue, par exemple "jvc" pour "Jobs View Controller". Lorsque j'ai essayé de construire, j'ai reçu un message d'erreur indiquant que l'un des contrôleurs de vue avait un nom en double. En suivant les choses, j'ai trouvé que j'avais une copie réelle d'un contrôleur de vue empilé exactement au-dessus de son jumeau. Je soupçonne que c'était un dommage par couper-coller d'une expérience d'interface utilisateur que je n'ai pas complètement annulé.

Quoi qu'il en soit, la suppression du jumeau non connecté a résolu mon problème. Après cela, j'ai supprimé tous les noms de VC car ils ne sont pas référencés dans le code.

Bob H
la source
3
Cela m'est arrivé aussi, mais je devais encore remplir l'un des nombreux videsStoryboard ID
Pierre de LESPINAY
... alors je crois que @bobnoble est la bonne réponse à marquer d'un √
SwiftArchitect
139

Dans votre storyboard, sélectionnez chacun des contrôleurs de vue (flèche rouge dans l'image ci-dessous) et regardez le champ ID du storyboard (ovale rouge). Aucun des champs ID Storyboard ne doit être vide. Lorsque vous en trouvez un, c'est le coupable.

entrez la description de l'image ici

bobnoble
la source
6
Salut @bobnoble, merci pour votre réponse. Une question: pourquoi devrais-je définir l'ID Storyboard pour chaque scène? Je ne pense pas que ce soit obligatoire, n'est-ce pas? Je sais que je dois définir un identifiant si je veux accéder par programmation à la scène, mais que faire si toutes mes scènes sont connectées via des segues? Ou s'agit-il simplement d'une bonne pratique de programmation?
Wolfy
@Wolfy - bon point, vous devez regarder chacun pour vous assurer qu'il a un identifiant de segue ou de storyboard.
bobnoble
2
En essayant cette solution, je me suis rendu compte que le remplissage d'un seul spécifique Storyboard IDsupprimait l'avertissement
Pierre de LESPINAY
J'en ai eu UINavigationControllerplusieurs UIViewControllerset j'ai dû définir un identifiant pour tous, même si je n'en appelle jamais l'un par identifiant. Vraiment ennuyeux, à la recherche d'un bug où personne n'est!
Alex Cio
Travaille pour moi. Est-ce que quelqu'un sait pourquoi cela se produit? Cela semble très impossible à découvrir - l'erreur donnée, rétrospectivement, donne un maigre indice. Je l'ai eu après avoir converti un storyboard vers le dernier et le meilleur - si l'ID de Storyboard est requis maintenant, ce n'était certainement pas avant, et la conversion automatique ne s'en est pas occupée.
Josh Sutterfield
30

Je viens d'avoir cette erreur exacte avec un simple storyboard à une seule scène, et tout ce que j'avais à faire pour le réparer était de cocher la case "Est le contrôleur de vue initial" pour le contrôleur de vue 1 dans le storyboard. Je soupçonne que Xcode a coché cette case pour vous par défaut dans cette situation, mais ce n'est plus le cas.

Cochez la case en bas

                                     

Cochez la case pour exactement l'un des contrôleurs de vue dans votre storyboard et vous devriez être bon.

w0mbat
la source
1
Merci. C'était ça!
Eric Chen
20

J'ai bien peur que vous deviez les parcourir tous les 30 et vérifier s'ils ont un ID de Storyboard ou une transition vers ce contrôleur de vue. L'un des deux est obligatoire, les deux sont également une option.

Scott Berrevoets
la source
5
Une fois que tous les contrôleurs de vue ont leur segue ou leur ID, le message d'erreur peut toujours être là. Dans ce cas, nettoyez le produit et il disparaîtra.
Reinhard Männer
5
Dans mon cas, un produit propre n'était pas suffisant pour éliminer le message d'erreur après avoir corrigé l'erreur. Il a disparu lorsque j'ai redémarré Xcode. (Je n'ai pas essayé de fermer / rouvrir le projet. Cela a peut-être fonctionné aussi.)
JulianSymes
Idem pour moi - vous devez éventuellement arrêter et redémarrer xcode afin de vous débarrasser du message d'erreur.
MusiGenesis
8

Ce problème peut se produire dans l'un des scénarios suivants:

Cas I: Si aucune des scènes du storyboard n'est marquée comme "isInitialViewController" .

Correction: identifiez le contrôleur de vue racine et marquez-le comme "isInitialViewController" dans votre SB. Dans ce cas, l'identifiant du storyboard n'est pas obligatoire.

Cas II

Il peut y avoir des situations dans lesquelles vous n'avez pas besoin d'avoir un initialViewController dans un storyboard. Par exemple: lors de l'utilisation de plusieurs storyboards.

Correction: Dans de tels cas, assurez-vous que l ' "identifiant du storyboard" est correctement donné et que vous vous référez à la première scène à utiliser dans le storyboard en utilisant cet identifiant. Par exemple:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];

Dans ce cas, "l'identifiant du storyboard" est obligatoire.

Cas III

Votre initialViewController est connecté. Mais vous recevez toujours cet avertissement. Ceci est dû au fait que certaines des scènes du storyboard peuvent ne pas être connectées à un "segue" et qu'elles n'ont pas non plus "d'id de storyboard" . Scannez votre storyboard, voyez si un "segue" est nécessaire. Connectez le segue si cela manque. Si une séquence n'est pas nécessaire, assurez-vous que vous devez donner un "identifiant de storyboard" car c'est le seul moyen de faire référence à la scène à partir de votre code, comme indiqué dans l'exemple de code ci-dessus.

J'espère que cela t'aides

shah1988
la source
CAS III - m'a aidé. Merci!
mrGott
J'ai eu un cas où un exemple de projet est venu avec l'ancien fichier xib. J'ai créé un storyBoard et je souffre actuellement ... besoin de convertir le xib au format storyBoard et de partir de là ... je ne vois aucun moyen de créer une scène d'application ou un menu ..
nyxee
6

Vous n'avez pas besoin de définir Storyboard IDpour toutes les scènes ouUINavigationController

Eh bien, j'ai environ 50 à 60 scènes et je viens de recevoir ces avertissements afin de me rendre compte que seul le contrôleur (Scene) ou NavigationController qui n'est pas connecté à segue doit être défini Storyboard ID.

entrez la description de l'image ici

Vous pouvez voir que dans l'image ci-dessus UINavigationControllern'est pas lié à segue, c'était un coupable de cet avertissement.

Donnez-lui simplement un ID de Storyboard pour supprimer cet avertissement.

Kampai
la source
5

J'ai eu le même problème. J'ai beaucoup de vues sur mon storyboard avec un contrôleur de barre de navigation et d'onglets. Pour moi, c'était juste un avertissement pour vous faire savoir que certaines vues ne sont pas liées. Assurez-vous que toutes vos vues sont connectées d'une manière ou d'une autre au contrôleur de vue racine . Je commençais ce projet à partir de zéro pour éliminer cet avertissement et j'ai remarqué le même avertissement lorsqu'une vue n'était pas connectée.

Richard
la source
Cela m'a aidé. J'utilise dépasse 7.1.1 Swift 2. Le StoryBoard initial DOIT être le contrôleur de vue racine.
Lukesivi
3

Le moyen le plus simple de trouver la scène incriminée:

Accédez au navigateur de problèmes (dans le panneau de gauche, à côté du bouton de recherche) et double-cliquez sur l'erreur. Une fenêtre apparaîtra contenant la scène incriminée centrée au milieu de la fenêtre.

(C'est en fait généralement vrai - un double clic sur une erreur entraînera généralement une fenêtre contextuelle contenant l'erreur centrée - une petite astuce!)

Note latérale: Parfois, XCode donnera incorrectement cette erreur pour une scène qui est le contrôleur de vue racine d'un contrôleur de navigation (c'est-à-dire le contrôleur de vue initial). Une solution simple consiste à donner à ce contrôleur de vue racine un ID de Storyboard, à compiler (l'erreur devrait disparaître), puis à supprimer l'ID de storyboard (plus d'erreur).

ajay14
la source
Merci pour votre indice "Une solution simple est de donner à ce contrôleur de vue racine un ID de Storyboard". Cela a résolu mon problème. Eh bien, j'ai besoin de donner 'Storyboard ID' à UINavigationController.
Mohd Haider
Cela m'indique la scène d'application avec le menu principal. Je ne peux pas lui donner un ID de storyboard.
Daniel
2

Le moyen le plus simple de voir quel contrôleur ou quelle scène est à l'origine de ce problème est de:

  • Ctrl-clic sur votre .storyboarddans le navigateur de projet et sélection Open As > Source Code. Cela fera apparaître le XML sous-jacent du Storyboard.
  • Dans cette vue, l'avertissement sera clairement lié à une ligne dans le XML qui se rapporte à la scène incriminée.

Maintenant, dans mon cas, l'avertissement était particulièrement ennuyeux car la "scène incriminée" avait un identifiant et une suite! J'ai pu remédier au problème en supprimant la scène puis en annulant la suppression. Pas élégant, mais travaillé. J'ai enregistré mon Storyboard avant de faire cela. Rétrospectivement, j'aurais dû en faire une copie et faire diffl'avant-après.

Dmitry Minkovsky
la source
2
Étrangement, cela ne semble pas fonctionner de manière cohérente. Dans ma situation d'écoute, cela a fonctionné. Maintenant, je le teste et la Source Codevue ne montre pas l'erreur. Ainsi, le kilométrage peut varier.
Dmitry Minkovsky
Je n'ai pas trouvé le contrôleur de vue avec cela, mais je l'ai supprimé (en XML, ne fonctionnait pas dans l'ID) et l'avertissement avait disparu.
Daniel
2

Pour moi, ce n'était pas à cause de a Storyboard IDou a Segue. Je recevais cet avertissement car je n'avais pas défini le View Controller's Custom Class.

Sélectionnez le View Controllersur le Storyboard, puis dans le Utilities Pane, sélectionnez l' Identity Inspectoricône. Sous Custom Class, voyez quelle valeur se trouve à l'intérieur du Classchamp.

Si cela dit simplement UIViewController, vous devez saisir le nom de la classe. Ce sera le nom de vos fichiers .het .mqui composent votre UIViewControllersous-classe personnalisée .

user3344977
la source
Je viens d'avoir une variation à ce sujet. J'ai fait correspondre le mauvais ViewController dans mon storyboard à la classe ViewController, et la même chose avec l'ID du storyboard.
Vince O'Sullivan
2

Je suis venu à cette question aujourd'hui. J'utilise Xcode 6.3 et la réponse à la question de l'OP est assez simple maintenant:

Sélectionnez le contrôleur de vue que vous souhaitez être le premier, affichez l'inspecteur d'attributs, et sous la section Contrôleur de vue, assurez-vous

Est le contrôleur de vue initiale

est vérifié. Voilà!

Zonker.in.Genève
la source
2

Avec Xcode 7, cela peut être géré facilement. Il n'est pas nécessaire de parcourir manuellement toutes les scènes pour en trouver une problématique. Accédez d'abord au navigateur de rapports , où vous pouvez obtenir des informations plus détaillées sur les problèmes connus. La description du problème peut ressembler à ceci:

Base.lproj / Main.storyboard: fPh-fe-F5F : avertissement: la scène est inaccessible en raison du manque de points d'entrée et n'a pas d'identifiant pour l'accès à l'exécution via -instantiateViewControllerWithIdentifier :.

Avec cette information, vous pouvez copier l'ID de l'objet, dans ce cas, c'était fPh-fe-F5F , et rechercher dans l'espace de travail l'occurrence de cette chaîne. La chaîne se trouve dans le fichier Main.storyboard. Double-cliquez sur le résultat de la recherche et il sera ouvert Main.storyboard avec la scène sélectionnée. Une fois que vous connaissez une scène problématique, vous pouvez facilement résoudre le problème, en définissant l'ID du storyboard ou en définissant "Is Initial View Controller"

Sergio
la source
1

Vous pouvez simplement définir un identifiant. Sur l'inspecteur d'attributs dans le volet droit, vous trouverez un champ appelé "Identifiant". Il suffit de mettre une chaîne là-dedans, cela devrait fonctionner

Vous pouvez cliquer sur le contrôleur de navigation et sous l'inspecteur d'attributs, cliquer sur le bouton "est le contrôleur de vue initial", et cela devrait également fonctionner.

Mohammad Rabi
la source
1
Mohammad, merci d'avoir répondu mais le problème est: sur quelle scène dois-je définir un identifiant? Je ne parviens pas à localiser la scène à l'origine de l'avertissement, c'est le problème principal.
Wolfy
1

J'ai fait face au même problème et résolu avec mis sur l'ID de storyboard n'importe quel identifiant pour tous viewController et NavigationController également; l'erreur sera supprimée immédiatement

prendre plaisir!!!

Sonique
la source
0

Peut-être que cette XQuery vous aidera à trouver ces scènes désagréables

for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id      (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController             (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :) 
return ($i, $i/../@customClass)                                                                   (: return the storyboard-id and the customClass, if any :)

Si vous avez installé xqilla, vous enregistrez la requête dans un fichier et l'utilisez comme

xqilla <xqueryfile> -i <path to your storyboard>
parallaxe
la source
0

Je ne sais pas si cela n'a pas encore été mentionné ou non, mais une autre raison pour laquelle vous pourriez recevoir cet avertissement est si vous avez une séquence qui va dans la mauvaise direction. Par exemple, dans mon projet, je recevais cet avertissement mais tous mes contrôleurs étaient en fait connectés. Cependant, l'un d'entre eux avait une suite qui consistait essentiellement à essayer de présenter le parent de l'enfant au lieu du parent présentant l'enfant. Cela a provoqué le même avertissement.

miken.mkndev
la source
0

J'ai reçu cet avertissement lorsque j'ai un UIViewController dans Storyboard sur lequel rien n'est défini. J'ai évité cet avertissement en lui attribuant un ID de Storyboard.

Durga Vundavalli
la source
0

J'ai eu le même problème, mais j'ai réalisé que j'utilisais la vue du conteneur et au lieu de supprimer le contrôleur de vue par défaut, j'ai supprimé sa séquence.Le contrôleur de vue est donc resté dans le storyboard, tout comme l'avertissement. C'est donc l'un des cas où un avertissement apparaît si le contrôleur de vue par défaut de la vue du conteneur n'est pas supprimé correctement lorsque vous n'en avez pas besoin.

Profond
la source
0

J'ai essayé tout ce qui est décrit ci-dessus en vain. J'avais tout connecté correctement dans IB, avec exactement un UIViewControllerdésigné le contrôleur de vue racine. Je n'avais aucun identifiant mais je les ai ajoutés à tous mes contrôleurs.

La seule façon de faire disparaître l'avertissement était de faire tout ce qui précède (y compris un redémarrage de l'ordinateur et une version propre), puis de passer à une branche sans erreur de mon projet dans git et inversement.

Je ne sais pas quelle action l'a corrigé, ou quelle combinaison d'actions, mais ce n'était pas la construction propre en soi. Cela pourrait être un sous-produit de Main.storyboard qui change toujours lors de sa simple ouverture, ce qui signifie que je dois le faire git commit -m "Stupid storyboard"plus souvent que je ne le souhaite.

Corwin Newall
la source
0

Voici ce qui a fonctionné pour moi:

  1. Ouvrez le storyboard dans un éditeur de texte.
  2. Changez la version de 3.0 à 2.0 enregistrez-la et fermez-la.
  3. Ouvrez-le à nouveau dans Visual Studio. Il convertira et ouvrira automatiquement le document.
vegas2ny
la source
0

J'ai eu la même erreur: pour moi, l'erreur était que je n'avais pas lancé de contrôleur de vue dans mon storyboard.

La correction de cela a supprimé cet avertissement.

Vetri Selvi Vairamuthu
la source
0

Le simple fait de donner à tous les MVC un identifiant de storyboard a fonctionné pour moi.

Elia Döhler
la source