Xcode: "Szene ist wegen fehlender Einstiegspunkte nicht erreichbar", kann sie aber nicht finden

89

Xcode 4.5.2 gibt mir folgende Warnung:

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

Leider kann ich die belastete Szene nicht identifizieren. Durch Auswahl der Warnung im Issue Navigator wird nichts im Storyboard hervorgehoben. Ich habe ein ziemlich kompliziertes Storyboard (über 30 Szenen).

Irgendwelche Vorschläge?

Screenshot zur Warnung

Wolfy
quelle

Antworten:

50

Während dieser Thread alt ist, habe ich keine Antwort gesehen, die beschreibt, was für mich funktioniert hat.

Ich hatte diesen Fehler und eine visuelle Untersuchung des Storyboards ergab, dass alle View Controller mit dem Root View Controller verbunden zu sein schienen.

Ich habe versucht, alle 17 View-Controller im Storyboard zu benennen (wie in der Antwort von @ bobnoble). Ich habe eine Namenskonvention verwendet, die auf dem langen Namen des View Controllers basiert, z. B. "jvc" für "Jobs View Controller". Beim Versuch zu erstellen wurde eine Fehlermeldung angezeigt, die darauf hinwies, dass einer der View-Controller einen doppelten Namen hat. Als ich die Dinge aufspürte, stellte ich fest, dass ich ein tatsächliches Duplikat hatte eines View-Controllers hatte, das genau auf seinem Zwilling gestapelt war. Ich vermute, es war ein Schaden durch Ausschneiden und Einfügen durch ein Experiment mit der Benutzeroberfläche, den ich nicht vollständig zurückgezogen habe.

Wie auch immer, das Löschen des nicht verbundenen Zwillings löste mein Problem. Danach habe ich alle VC-Namen entfernt, da sie im Code nicht referenziert sind.

Bob H.
quelle
3
Das passierte mir auch, aber ich musste immer noch eine der vielen leeren füllenStoryboard ID
Pierre de LESPINAY
... dann glaube ich, dass @bobnoble die richtige Antwort ist, um mit einem √
SwiftArchitect
139

Wählen Sie in Ihrem Storyboard jeden View Controller aus (roter Pfeil im Bild unten) und sehen Sie sich das Feld Storyboard-ID (rotes Oval) an. Keines der Storyboard-ID-Felder sollte leer sein. Wenn Sie einen finden, der ist, ist das der Schuldige.

Geben Sie hier die Bildbeschreibung ein

Bobnoble
quelle
6
Hallo @bobnoble, danke für deine Antwort. Eine Frage: Warum sollte ich die Storyboard-ID für jede Szene festlegen? Ich denke nicht, dass es obligatorisch ist, nicht wahr? Ich weiß, dass ich eine ID festlegen muss, wenn ich programmgesteuert auf die Szene zugreifen möchte, aber was ist, wenn alle meine Szenen über Segmente verbunden sind? Oder ist es nur eine gute Programmierpraxis?
Wolfy
@ Wolfy - guter Punkt, Sie müssen sich jedes ansehen, um sicherzustellen, dass es entweder eine Segue- oder eine Storyboard-ID hat.
Bobnoble
2
Als ich diese Lösung versuchte, stellte ich fest, dass das Ausfüllen nur eines bestimmten Storyboard IDdie Warnung entfernte
Pierre de LESPINAY
Ich hatte UINavigationControllerfür mehrere UIViewControllersund musste eine Kennung für alle von ihnen setzen, auch wenn ich nie eine von ihnen durch Kennung nenne. Wirklich nervig, auf der Suche nach einem Bug, wo niemand ist!
Alex Cio
Funktioniert bei mir. Weiß jemand warum das so ist? Scheint sehr unentdeckbar - der Fehler im Nachhinein gibt einen mageren Hinweis. Ich habe es erhalten, nachdem ich ein Storyboard in das neueste und beste konvertiert habe - wenn jetzt eine Storyboard-ID erforderlich ist, war dies sicherlich noch nicht der Fall, und die automatische Konvertierung hat sich nicht darum gekümmert.
Josh Sutterfield
30

Ich hatte gerade genau diesen Fehler mit einem einfachen Storyboard mit einer Szene, und alles, was ich tun musste, um ihn zu beheben, war das Kontrollkästchen "Ist Initial View Controller" für den 1 View Controller im Storyboard zu aktivieren. Ich vermute, dass Xcode in dieser Situation standardmäßig dieses Kontrollkästchen für Sie aktiviert hat, dies jedoch nicht mehr.

Aktivieren Sie das Kontrollkästchen unten

                                     

Aktivieren Sie das Kontrollkästchen für genau einen der View-Controller in Ihrem Storyboard, und Sie sollten gut sein.

w0mbat
quelle
1
Vielen Dank. Das war's!
Eric Chen
20

Ich fürchte, Sie müssen alle 30 durchgehen und prüfen, ob sie eine Storyboard-ID oder einen Übergang zu diesem Ansichts-Controller haben. Einer der beiden ist erforderlich, beide sind ebenfalls eine Option.

Scott Berrevoets
quelle
5
Nachdem alle View Controller ihre Segue oder ID haben, ist die Fehlermeldung möglicherweise immer noch vorhanden. Reinigen Sie in diesem Fall das Produkt, und es ist verschwunden.
Reinhard Männer
5
In meinem Fall reichte eine Produktreinigung nicht aus, um die Fehlermeldung zu entfernen, nachdem ich den Fehler behoben hatte. Es verschwand, als ich Xcode neu startete. (Ich habe nicht versucht, das Projekt zu schließen / wieder zu öffnen. Das hat vielleicht auch funktioniert.)
JulianSymes
Das Gleiche gilt für mich - schließlich müssen Sie xcode stoppen und neu starten, um die Fehlermeldung zu entfernen.
MusiGenesis
8

Dieses Problem kann in einem der folgenden Szenarien auftreten:

Fall I: Wenn keine der Szenen im Storyboard als "isInitialViewController" markiert ist .

Fix: Identifizieren Sie den Root View Controller und markieren Sie ihn in Ihrem SB als "isInitialViewController" . In diesem Fall ist die Storyboard-ID nicht obligatorisch.

Fall II

Es kann Situationen geben, in denen Sie keinen initialViewController in einem Storyboard benötigen. Zum Beispiel: bei Verwendung mehrerer Storyboards.

Fix: Stellen Sie in solchen Fällen sicher, dass die "Storyboard-ID" korrekt angegeben ist und Sie mit dieser ID auf die erste Szene verweisen, die im Storyboard verwendet wird. Zum Beispiel:

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

In diesem Fall ist "Storyboard-ID" obligatorisch.

Fall III

Sie haben Ihren initialViewController angeschlossen. Trotzdem erhalten Sie diese Warnung. Dies liegt daran, dass einige der Szenen im Storyboard möglicherweise nicht mit einem "Segue" verbunden sind und auch keine "Storyboard-ID" haben . Scannen Sie Ihr Storyboard und prüfen Sie, ob ein "Segue" erforderlich ist. Schließen Sie den Segue an, wenn dieser fehlt. Wenn kein Segue benötigt wird, müssen Sie eine "Storyboard-ID" angeben. da dies die einzige Möglichkeit ist, die Szene aus Ihrem Code zu referenzieren, wie im obigen Beispielcode gezeigt.

Hoffe das hilft

shah1988
quelle
Fall III - hat mir geholfen. Vielen Dank!
MrGott
Ich hatte einen Fall, in dem ein Beispielprojekt mit der alten xib-Datei geliefert wurde. Ich habe ein StoryBoard erstellt und leide derzeit. Ich muss die XIB in das StoryBoard-Format konvertieren und von dort aus umziehen. Ich kann keine Möglichkeit sehen, eine Anwendungsszene oder ein Menü zu erstellen.
Nyxee
6

Sie müssen nicht Storyboard IDfür alle Szenen oder einstellenUINavigationController

Nun, ich habe ungefähr 50-60 Szenen und ich habe gerade diese Warnung erhalten, damit mir klar wird, dass nur der Controller (Szene) oder der Navigationscontroller, der nicht mit segue verbunden ist, eingestellt werden muss Storyboard ID.

Geben Sie hier die Bildbeschreibung ein

Sie können sehen, dass das obige Bild UINavigationControllernicht mit Segue verbunden ist, es war ein Schuldiger dieser Warnung.

Geben Sie ihm einfach eine Storyboard-ID, um diese Warnung zu entfernen.

Kampai
quelle
5

Ich hatte das gleiche Problem. Ich habe viele Ansichten auf meinem Storyboard mit einem Navigations- und Registerkarten-Controller. Für mich war es nur eine Warnung, Sie wissen zu lassen, dass einige der Ansichten nicht miteinander verbunden sind. Stellen Sie sicher, dass alle Ihre Ansichten in irgendeiner Weise mit dem Root-View-Controller verbunden sind . Ich habe dieses Projekt von Grund auf neu gestartet, um diese Warnung zu entfernen, und habe dieselbe Warnung bemerkt, wenn keine Ansicht verbunden war.

Richard
quelle
Das hat mir geholfen. Ich verwende mehr als 7.1.1 Swift 2. Das anfängliche StoryBoard muss der Root-View-Controller sein.
Lukesivi
3

Einfachster Weg, um die beleidigende Szene zu finden:

Gehen Sie zum Problemnavigator (im linken Bereich neben der Suchschaltfläche) und doppelklicken Sie auf den Fehler. Ein Fenster mit der betreffenden Szene in der Mitte des Fensters wird angezeigt.

(Dies ist im Allgemeinen der Fall - ein Doppelklick auf einen Fehler führt im Allgemeinen zu einem Popup mit dem Fehler zentriert - ein kleiner Trick!)

Randnotiz: Manchmal gibt XCode diesen Fehler fälschlicherweise für eine Szene aus, die der Root-View-Controller eines Navigations-Controllers ist (dh der anfängliche View-Controller). Eine einfache Lösung besteht darin, diesem Root-View-Controller eine Storyboard-ID zu geben, zu kompilieren (Fehler sollte verschwinden) und dann die Storyboard-ID zu entfernen (kein Fehler mehr).

ajay14
quelle
Vielen Dank für Ihren Hinweis "Einfache Korrektur gibt diesem Root-View-Controller eine Storyboard-ID". Es hat mein Problem gelöst. Nun, ich muss UINavigationController 'Storyboard ID' geben.
Mohd Haider
Dies verweist mich auf die Anwendungsszene mit dem Hauptmenü. Ich kann dem keine Storyboard-ID geben.
Daniel
2

Der einfachste Weg, um festzustellen, welcher Controller oder welche Szene dieses Problem verursacht, ist:

  • Klicken Sie .storyboardbei gedrückter Strg-Taste im Projektnavigator auf und wählen Sie Open As > Source Code. Dadurch wird das zugrunde liegende XML des Storyboards aufgerufen.
  • In dieser Ansicht bezieht sich die Warnung eindeutig auf eine Zeile im XML, die sich auf die betreffende Szene bezieht.

In meinem Fall war die Warnung besonders ärgerlich, weil die "beleidigende Szene" eine Kennung und einen Übergang hatte! Ich konnte das Problem beheben, indem ich die Szene löschte und dann das Löschen rückgängig machte. Nicht elegant, aber funktioniert. Ich habe mein Storyboard zuvor gespeichert. Im Nachhinein hätte ich eine Kopie machen und diffdas Vorher-Nachher machen sollen.

Dmitry Minkovsky
quelle
2
Seltsamerweise scheint dies nicht konsequent zu funktionieren. In meiner nervösen Situation hat es funktioniert. Jetzt teste ich es und die Source CodeAnsicht zeigt den Fehler nicht an. Der Kilometerstand kann also variieren.
Dmitry
Ich habe den View Controller damit nicht gefunden, aber ich habe ihn gelöscht (in XML, funktionierte nicht in ID) und die Warnung war verschwunden.
Daniel
2

Für mich war es nicht wegen a Storyboard IDoder a Segue. Ich erhielt diese Warnung, weil ich die nicht eingestellt hatte View Controller's Custom Class.

Wählen Sie die View Controllerauf die Storyboarddann in die Utilities Pane, die wählen Identity InspectorSymbol. Custom ClassSehen Sie unter , welcher Wert sich innerhalb des ClassFeldes befindet.

Wenn nur angezeigt wird UIViewController, müssen Sie den Klassennamen eingeben. Dies ist der Name Ihrer .hund der .mDateien, aus denen Ihre benutzerdefinierte UIViewControllerUnterklasse besteht.

user3344977
quelle
Ich habe gerade eine Variation davon gehabt. Ich habe den falschen ViewController in meinem Storyboard mit der ViewController-Klasse abgeglichen und dasselbe mit der Storyboard-ID.
Vince O'Sullivan
2

Ich bin heute zu dieser Frage gekommen. Ich verwende Xcode 6.3 und die Antwort auf die Frage des OP ist jetzt ganz einfach:

Wählen Sie den View Controller aus, der der erste sein soll, zeigen Sie den Attributinspektor an und stellen Sie im Abschnitt View Controller sicher, dass

Ist Initial View Controller

wird geprüft. Voilà!

Zonker.in.Geneva
quelle
2

Mit Xcode 7 kann dies einfach gehandhabt werden. Es ist nicht erforderlich, alle Szenen manuell durchzugehen, um eine problematische zu finden. Gehen Sie zuerst zum Berichtsnavigator , in dem Sie detailliertere Informationen zu bekannten Problemen erhalten. Die Problembeschreibung kann folgendermaßen aussehen:

Base.lproj / Main.storyboard: fPh-fe-F5F : Warnung: Die Szene ist aufgrund fehlender Einstiegspunkte nicht erreichbar und hat keine Kennung für den Laufzeitzugriff über -instantiateViewControllerWithIdentifier:.

Mit diesen Informationen können Sie die Objekt-ID, in diesem Fall fPh-fe-F5F , kopieren und den Arbeitsbereich nach dem Auftreten dieser Zeichenfolge durchsuchen. Die Zeichenfolge befindet sich in der Datei Main.storyboard. Doppelklicken Sie auf das Suchergebnis und es wird Main.storyboard mit der ausgewählten Szene geöffnet. Sobald Sie eine problematische Szene kennen, können Sie das Problem einfach beheben, indem Sie die Storyboard-ID oder "Is Initial View Controller" festlegen.

Sergio
quelle
1

Sie können einfach eine Kennung festlegen. Im Attributinspektor im rechten Bereich finden Sie ein Feld mit dem Namen "Bezeichner". Fügen Sie einfach eine Zeichenfolge ein, dies sollte funktionieren

Sie können auf den Navigationscontroller klicken und unter dem Attributinspektor auf die Schaltfläche "Erstansichtscontroller" klicken. Dies sollte auch funktionieren.

Mohammad Rabi
quelle
1
Mohammad, danke für die Antwort, aber das Problem ist: In welcher Szene soll ich eine Kennung setzen? Ich kann die Szene, die die Warnung verursacht, nicht finden, das ist das Hauptproblem.
Wolfy
1

Ich stand vor dem gleichen Problem und löste mit der aufgesetzten Storyboard-ID jede Kennung für alle viewController und NavigationController. Der Fehler wird sofort behoben

genießen!!!

Schall
quelle
0

Vielleicht hilft Ihnen diese XQuery, diese fiesen Szenen zu finden

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 :)

Wenn Sie xqilla installiert haben, speichern Sie die Abfrage in einer Datei und verwenden sie wie folgt

xqilla <xqueryfile> -i <path to your storyboard>
Parallaxe
quelle
0

Ich weiß nicht, ob dies noch nicht erwähnt wurde oder nicht, aber ein weiterer Grund, warum Sie diese Warnung erhalten könnten, ist, wenn Sie einen Übergang in die falsche Richtung haben. In meinem Projekt wurde beispielsweise diese Warnung angezeigt, aber alle meine Controller waren tatsächlich verbunden. Einer von ihnen hatte jedoch einen Übergang, der im Grunde versuchte, den Elternteil vom Kind zu präsentieren, anstatt dass der Elternteil das Kind präsentierte. Dies verursachte die gleiche Warnung.

miken.mkndev
quelle
0

Ich habe diese Warnung erhalten, wenn ich einen UIViewController im Storyboard habe, auf den nichts eingestellt ist. Ich habe diese Warnung vermieden, indem ich die Storyboard-ID darauf gesetzt habe.

Durga Vundavalli
quelle
0

Ich hatte das gleiche Problem, aber mir wurde klar, dass ich die Containeransicht verwendete, und anstatt den Standardansichtscontroller zu löschen, löschte ich seinen Abschnitt. So blieb der Ansichtscontroller im Storyboard, ebenso wie die Warnung. Dies ist einer der Fälle, in denen eine Warnung angezeigt wird, wenn der Standardansichts-Controller der Containeransicht nicht ordnungsgemäß gelöscht wird, wenn Sie ihn nicht benötigen.

tief
quelle
0

Ich habe alles, was oben beschrieben wurde, ohne Erfolg versucht. Ich hatte alles richtig in IB verbunden, wobei genau einer UIViewControllerals Root View Controller bezeichnet wurde. Ich hatte keine Kennungen, fügte sie aber allen meinen Controllern hinzu.

Die einzige Möglichkeit, die Warnung zum Verschwinden zu bringen, bestand darin, alles oben Genannte zu tun (einschließlich eines Neustarts des Computers und eines sauberen Builds) und dann zu einem fehlerfreien Zweig meines Projekts in Git und wieder zurück zu wechseln.

Unsicher, welche Aktion es behoben hat oder welche Kombination von Aktionen, aber es war nicht der saubere Build für sich. Dies kann ein Nebenprodukt von Main.storyboard sein, das sich beim einfachen Öffnen ständig ändert, was bedeutet, dass ich git commit -m "Stupid storyboard"öfter muss, als ich möchte.

Corwin Newall
quelle
0

Folgendes hat bei mir funktioniert:

  1. Öffnen Sie das Storyboard in einem Texteditor.
  2. Ändern Sie die Version von 3.0 auf 2.0, speichern und schließen Sie sie.
  3. Öffnen Sie es erneut im Visual Studio. Das Dokument wird automatisch konvertiert und geöffnet.
vegas2ny
quelle
0

Ich habe den gleichen Fehler erhalten: Für mich war der Fehler, dass ich keinen View Controller in meinem Storyboard initiiert habe.

Durch das Beheben dieser Warnung wurde diese Warnung entfernt.

Vetri Selvi Vairamuthu
quelle
0

Es hat für mich einfach funktioniert, allen MVCs eine Storyboard-ID zu geben.

Elia Döhler
quelle