Xcode: "La scena è irraggiungibile per mancanza di punti di ingresso" ma non riesce a trovarla


89

Xcode 4.5.2 mi dà il seguente avviso:

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

Purtroppo non riesco a identificare la scena incriminata. La selezione dell'avviso nel Navigatore problema non evidenzia nulla nello Storyboard. Ho uno storyboard abbastanza complicato (oltre 30 scene).

Eventuali suggerimenti?

Screenshot per avvertimento

Risposte:


50

Anche se questo thread è vecchio, non ho visto una risposta che descriva cosa ha funzionato per me, quindi ecco qui ...

Ho avuto questo errore e l'esame visivo dello storyboard ha mostrato che tutti i controller di visualizzazione sembravano essere collegati al controller di visualizzazione principale.

Ho provato a nominare tutti i 17 controller di visualizzazione nello storyboard (come nella risposta di @ bobnoble). Ho usato una convenzione di denominazione basata sul nome lungo del controller di visualizzazione, ad esempio "jvc" per "Controller di visualizzazione dei lavori". Quando ho provato a compilare, ho ricevuto un messaggio di errore che indicava uno dei controller di visualizzazione con un nome duplicato. Rintracciando le cose, ho scoperto che avevo un duplicato effettivo di un controller di visualizzazione impilato esattamente sopra il suo gemello. Sospetto che sia stato un danno taglia e incolla da un esperimento dell'interfaccia utente che non ho ritirato completamente.

Comunque, l'eliminazione del gemello scollegato ha risolto il mio problema. Dopodiché, ho rimosso tutti i nomi VC poiché non sono referenziati nel codice.


3
Questo è successo anche a me, ma dovevo ancora riempire uno dei tanti vuotiStoryboard ID
Pierre de LESPINAY

... quindi credo che @bobnoble sia la risposta corretta da contrassegnare con √
SwiftArchitect

139

Nello storyboard, seleziona ciascuno dei controller di visualizzazione (freccia rossa nell'immagine sotto) e guarda il campo ID storyboard (ovale rosso). Nessuno dei campi ID storyboard deve essere vuoto. Quando ne trovi uno che sia, quello è il colpevole.

inserisci qui la descrizione dell'immagine


6
Ciao @ Bobnoble, grazie per la tua risposta. Una domanda: perché dovrei impostare l'ID Storyboard per ogni scena? Non credo sia obbligatorio, non è vero? So che devo impostare un ID se voglio accedere a livello di programmazione alla scena, ma cosa succede se tutte le mie scene sono collegate tramite segues? O è solo una buona pratica di programmazione?
Wolfy

@ Wolfy - buon punto, devi guardare ciascuno per assicurarti che abbia un segue o un ID storyboard.
bobnoble

2
Provando questa soluzione, mi sono reso conto che riempire solo uno specifico Storyboard IDrimuoveva l'avvertimento
Pierre de LESPINAY

Ne ho avuti UINavigationControllerdiversi UIViewControllerse ho dovuto impostare un identificatore per tutti loro, anche se non ne chiamo mai uno per identificatore. Davvero fastidioso, alla ricerca di un bug dove nessuno è!
Alex Cio

Per me va bene. Qualcuno sa perché questo si verifica? Sembra davvero impercettibile: l'errore fornito, in retrospettiva, fornisce un indizio scarso. L'ho ottenuto dopo aver convertito uno storyboard nell'ultimo e più grande: se l'ID Storyboard è richiesto ora, certamente non lo era prima e la conversione automatica non si è occupata di questo.
Josh Sutterfield

30

Ho appena avuto questo errore esatto con un semplice Storyboard a scena singola, e tutto quello che dovevo fare per risolverlo è stato selezionare la casella di controllo "Is Initial View Controller" per il controller di visualizzazione 1 nello Storyboard. Sospetto che Xcode fosse utilizzato per selezionare questa casella per impostazione predefinita in questa situazione, ma non lo fa più.

Seleziona la casella in basso

                                     

Seleziona la casella per esattamente uno dei controller di visualizzazione nel tuo storyboard e dovresti essere bravo.


1
Grazie. Ecco fatto!
Eric Chen

20

Temo che dovrai esaminarli tutti e 30 e verificare se hanno un ID Storyboard o un seguito a quel controller di visualizzazione. Uno dei due è richiesto, entrambi sono anche un'opzione.


5
Dopo che tutti i controller di visualizzazione hanno il proprio Segue o ID, il messaggio di errore potrebbe essere ancora presente. In questo caso, pulire il prodotto e sparirà.
Reinhard Männer

5
Nel mio caso una pulizia del prodotto non era sufficiente per eliminare il messaggio di errore dopo aver corretto l'errore. È scomparso quando ho riavviato Xcode. (Non ho provato a chiudere / riaprire il progetto. Potrebbe anche aver funzionato.)
JulianSymes

Lo stesso per me: alla fine è necessario interrompere e riavviare xcode per eliminare il messaggio di errore.
MusiGenesis

8

Questo problema può verificarsi in uno dei seguenti scenari:

Caso I: se nessuna delle scene nello storyboard è contrassegnata come "isInitialViewController" .

Correzione: identificare il controller della vista principale e contrassegnarlo come "isInitialViewController" nel proprio SB. In questo caso l'ID dello storyboard non è obbligatorio.

Caso II

Possono verificarsi situazioni in cui non è necessario disporre di un initialViewController in uno storyboard. Ad esempio: quando si utilizzano più storyboard.

Correzione: in questi casi assicurati che l ' "ID storyboard" sia fornito correttamente e fai riferimento alla prima scena da utilizzare nello storyboard utilizzando questo ID. Ad esempio:

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

In questo caso "id storyboard" è obbligatorio.

Caso III

Hai il tuo initialViewController connesso. Ma continui a ricevere questo avviso. Questo perché alcune scene nello storyboard potrebbero non essere collegate a un "segue" e inoltre non hanno un "id storyboard" . Scansiona il tuo storyboard, vedi se è necessario un "segue" . Collega il segue se manca. Se non è necessario un segue, assicurati di dover fornire un "id storyboard" poiché è l'unico modo per fare riferimento alla scena dal tuo codice, come mostrato nel codice di esempio sopra.

Spero che questo ti aiuti


CASO III - mi ha aiutato. Grazie!
mrGott

Ho avuto un caso in cui un progetto di esempio veniva fornito con il vecchio file xib. Ho creato uno storyBoard e attualmente sto soffrendo .. devo convertire xib nel formato storyBoard e passare da lì .. non vedo alcun modo per creare una scena dell'applicazione o un menu ..
nyxee

6

Non è necessario impostare Storyboard IDper tutte le scene oUINavigationController

Bene, ho circa 50-60 scene e ho appena ricevuto questi avvertimenti in modo che mi renda conto che è necessario impostare solo il controller (Scene) o NavigationController che non è collegato a segue Storyboard ID.

inserisci qui la descrizione dell'immagine

Puoi vedere che nell'immagine sopra UINavigationControllernon è collegato a Segue, è stato il colpevole di quell'avvertimento.

Basta assegnargli un ID Storyboard per rimuovere questo avviso.


5

Ho avuto lo stesso problema. Ho molte visualizzazioni sul mio storyboard con un controller della barra di navigazione e delle schede. Per me è stato solo un avvertimento per farti sapere che alcune delle visualizzazioni non sono collegate. Assicurati che tutte le tue visualizzazioni siano collegate in qualche modo al controller di visualizzazione principale . Stavo iniziando questo progetto da zero per eliminare questo avviso e ho notato lo stesso avviso quando una vista non era collegata.


Questo mi ha aiutato. Sto usando oltre 7.1.1 Swift 2. Lo StoryBoard iniziale DEVE essere il controller di visualizzazione principale.
Lukesivi

3

Il modo più semplice per trovare la scena offensiva:

Vai al navigatore del problema (nel pannello di sinistra, accanto al pulsante di ricerca) e fai doppio clic sull'errore. Apparirà una finestra contenente la scena incriminata centrata al centro della finestra.

(Questo in realtà è generalmente vero: fare doppio clic su qualsiasi errore genererà generalmente un popup contenente l'errore centrato - un piccolo trucco carino!)

Nota a margine: a volte, XCode restituisce erroneamente questo errore per una scena che è il controller di visualizzazione principale di un controller di navigazione (che è il controller di visualizzazione iniziale). Una soluzione semplice consiste nel fornire a questo controller di visualizzazione principale un ID storyboard, compilare (l'errore dovrebbe scomparire) e quindi rimuovere lo storyboardID (nessun errore più).


Grazie per il tuo suggerimento "Una soluzione semplice è dare a questo controller di visualizzazione root un ID Storyboard". Ha risolto il mio problema. Bene, devo dare "ID Storyboard" a UINavigationController.
Mohd Haider

Questo mi indica la scena dell'applicazione con il menu principale. Non posso dargli un ID Storyboard.
Daniel

2

Il modo più semplice per vedere quale controller, o scena, sta causando questo problema è:

  • Fare clic tenendo premuto il tasto Ctrl .storyboardnel Navigatore progetto e selezionare Open As > Source Code. Questo farà apparire l'XML sottostante dello Storyboard.
  • In questa visualizzazione, l'avviso sarà chiaramente correlato a una riga nell'XML relativa alla scena del reato.

Ora, nel mio caso, l'avviso è stato particolarmente fastidioso perché la "scena incriminata" aveva un identificatore e un segue! Sono stato in grado di risolvere il problema eliminando la scena e quindi annullando l'eliminazione. Non elegante, ma funzionante. Ho salvato il mio Storyboard prima di farlo. In retrospettiva, avrei dovuto fare una copia e diffil prima-dopo.


2
Stranamente, questo non sembra funzionare in modo coerente. Nella mia situazione di bugg-out, ha funzionato. Ora lo sto testando e la Source Codevista non mostra l'errore. Quindi, il chilometraggio può variare.
Dmitry Minkovsky,

Non ho trovato il controller di visualizzazione con questo, ma l'ho cancellato (in XML, non funzionava in ID) e l'avviso era sparito.
Daniel

2

Per me, non è stato a causa di Storyboard IDao a Segue. Ho ricevuto questo avviso perché non avevo impostato l'estensione View Controller's Custom Class.

Selezionare View Controllersu Storyboard, quindi su Utilities Pane, selezionare l' Identity Inspectoricona. Sotto Custom Class, guarda qual è il valore all'interno del Classcampo.

Se dice solo UIViewController, allora devi digitare il nome della classe. Questo sarà il nome dei tuoi file .he .mche compongono la tua UIViewControllersottoclasse personalizzata .


Ho appena avuto una variazione su questo. Ho abbinato il ViewController sbagliato nel mio storyboard alla classe ViewController e lo stesso con l'ID Storyboard.
Vince O'Sullivan

2

Oggi sono arrivato a questa domanda. Sto usando Xcode 6.3 e la risposta alla domanda dell'OP è abbastanza semplice ora:

Seleziona il controller di visualizzazione che desideri sia il primo, mostra l'ispettore degli attributi e, nella sezione Controller di visualizzazione, assicurati

È Initial View Controller

è controllato. Ecco!


2

Con Xcode 7 questo può essere gestito facilmente. Non è necessario esaminare manualmente tutte le scene per trovarne una problematica. Per prima cosa vai al Navigatore rapporti , dove puoi ottenere informazioni più dettagliate sui problemi noti. La descrizione del problema può essere simile a questa:

Base.lproj / Main.storyboard: fPh-fe-F5F : avviso: la scena non è raggiungibile a causa della mancanza di punti di ingresso e non dispone di un identificatore per l'accesso runtime tramite -instantiateViewControllerWithIdentifier :.

Con queste informazioni, puoi copiare l'id oggetto, in questo caso era fPh-fe-F5F , e cercare nell'area di lavoro l'occorrenza di questa stringa. La stringa verrà trovata nel file Main.storyboard. Fare doppio clic sul risultato della ricerca e verrà aperto Main.storyboard con la scena selezionata. Una volta che conosci una scena problematica, puoi facilmente risolvere il problema, impostando l'ID dello storyboard o impostando "Is Initial View Controller"


1

Puoi semplicemente impostare un identificatore. Nell'ispettore degli attributi nel riquadro di destra, troverai un campo chiamato "Identificatore". Metti solo una stringa lì, dovrebbe funzionare

Puoi fare clic sul controller di navigazione e sotto l'ispettore degli attributi fare clic sul pulsante "è controller di visualizzazione iniziale", e anche questo dovrebbe funzionare.


1
Mohammad, grazie per la risposta ma il problema è: su quale scena devo impostare un identificatore? Non riesco a individuare la scena che causa l'avviso, questo è il problema principale.
Wolfy

1

ho affrontato lo stesso problema e ho risolto inserendo l'ID dello storyboard qualsiasi identificatore per tutti i viewController e anche il NavigationController; l'errore verrà rimosso immediatamente

godere!!!


0

Forse questo XQuery ti aiuterà a trovare quelle scene brutte

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

Se hai installato xqilla, salveresti la query in un file e lo userai come

xqilla <xqueryfile> -i <path to your storyboard>

0

Non so se questo non sia stato ancora menzionato o meno, ma un altro motivo per cui potresti ricevere questo avviso è se hai un segue che va nella direzione sbagliata. Ad esempio, nel mio progetto stavo ricevendo questo avviso ma tutti i miei controller erano effettivamente collegati. Tuttavia, uno di loro aveva un seguito che fondamentalmente stava cercando di presentare il genitore dal bambino invece che il genitore che presenta il bambino. Ciò ha causato lo stesso avvertimento.


0

Ho ricevuto questo avviso quando ho un UIViewController in Storyboard su cui non è impostato nulla. Ho evitato questo avviso impostando l'ID Storyboard su di esso.


0

Ho avuto lo stesso problema, ma mi sono reso conto che stavo usando la visualizzazione contenitore e invece di eliminare il controller di visualizzazione predefinito ho eliminato il suo segue, quindi il controller di visualizzazione è rimasto nello storyboard e così è stato l'avviso. Quindi questo è uno dei casi in cui viene visualizzato un avviso se il controller di visualizzazione predefinito della visualizzazione contenitore non viene eliminato correttamente quando non ne hai bisogno.


0

Ho provato tutto quanto sopra descritto senza alcun risultato. Avevo tutto collegato correttamente in IB, esattamente con unoUIViewController designato come controller di visualizzazione principale. Non avevo identificatori ma li ho aggiunti a tutti i miei controller.

L'unico modo in cui ho potuto far scomparire l'avviso era fare tutto quanto sopra (incluso un riavvio del computer e una build pulita) quindi passare a un ramo privo di errori del mio progetto in git e viceversa.

Non sono sicuro di quale azione sia stata risolta o di quale combinazione di azioni, ma non era la build pulita da sola. Questo potrebbe essere un sottoprodotto di Main.storyboard che cambia sempre dopo essere stato aperto, il che significa che devo farlo git commit -m "Stupid storyboard"più spesso di quanto voglio.


0

Ecco cosa ha funzionato per me:

  1. Apri lo storyboard in un editor di testo.
  2. Modificare la versione da 3.0 a 2.0 salvarla e chiuderla.
  3. Aprilo di nuovo in Visual Studio. Convertirà e aprirà automaticamente il documento.

0

Ho ricevuto lo stesso errore: per me l'errore era che non avevo avviato un controller di visualizzazione nel mio storyboard.

La correzione ha rimosso quell'avvertimento.


0

Dare semplicemente a tutti gli MVC un ID storyboard ha funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.