Xcode: "No se puede acceder a la escena debido a la falta de puntos de entrada" pero no se puede encontrar

89

Xcode 4.5.2 me da la siguiente advertencia:

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

Desafortunadamente, no puedo identificar la escena incriminada. Seleccionar la advertencia en el Navegador de problemas no resalta nada en el Guión gráfico. Tengo un guión gráfico bastante complicado (más de 30 escenas).

¿Alguna sugerencia?

Captura de pantalla de advertencia

Wolfy
fuente

Respuestas:

50

Si bien este hilo es antiguo, no vi una respuesta que describiera lo que funcionó para mí, así que aquí va ...

Tuve este error y el examen visual del guión gráfico mostró que todos los controladores de vista parecían estar conectados al controlador de vista raíz.

Intenté nombrar los 17 controladores de vista en el guión gráfico (como en la respuesta de @ bobnoble). Usé una convención de nomenclatura basada en el nombre largo del controlador de vista, por ejemplo, "jvc" para "Controlador de vista de trabajos". Cuando intenté compilar, recibí un mensaje de error que indicaba que uno de los controladores de vista tenía un nombre duplicado. Al rastrear las cosas, descubrí que tenía un duplicado real de un controlador de vista apilado exactamente encima de su gemelo. Sospecho que fue un daño de cortar y pegar de un experimento de interfaz de usuario que no eché atrás por completo.

De todos modos, eliminar el gemelo no conectado resolvió mi problema. Después de eso, eliminé todos los nombres de VC ya que no están referenciados en el código.

Bob H
fuente
3
Esto también me pasó a mí, pero todavía tenía que llenar uno de los muchos vacíosStoryboard ID
Pierre de LESPINAY
... entonces creo que @bobnoble es la respuesta correcta para marcar con un √
SwiftArchitect
139

En su guión gráfico, seleccione cada uno de los controladores de vista (flecha roja en la imagen a continuación) y mire el campo ID del guión gráfico (óvalo rojo). Ninguno de los campos de Id. Del guión gráfico debe estar en blanco. Cuando encuentre uno que sea, ese es el culpable.

ingrese la descripción de la imagen aquí

bobnoble
fuente
6
Hola @bobnoble, gracias por tu respuesta. Una pregunta: ¿por qué debería configurar el Storyboard ID para cada escena? No creo que sea obligatorio, ¿no? Sé que tengo que configurar una identificación si quiero acceder a la escena mediante programación, pero ¿y si todas mis escenas están conectadas a través de segues? ¿O es solo una buena práctica de programación?
Wolfy
@Wolfy: buen punto, debe mirar cada uno para asegurarse de que tenga una secuencia o una ID de guión gráfico.
bobnoble
2
Al probar esta solución, me di cuenta de que al llenar solo uno específico se Storyboard IDeliminó la advertencia
Pierre de LESPINAY
Tenía UINavigationControllervarios UIViewControllersy tuve que establecer un identificador para todos ellos, incluso nunca llamo a uno de ellos por identificador. Realmente molesto, ¡buscar un error donde no hay nadie!
Alex Cio
Funciona para mi. ¿Alguien sabe por qué surge esto? Parece muy imposible de descubrir: el error dado, en retrospectiva, da una pequeña pista. Lo obtuve después de convertir un guión gráfico al último y mejor: si ahora se requiere Storyboard ID, ciertamente no lo era antes, y la conversión automática no se encargó de ello.
Josh Sutterfield
30

Acabo de tener este error exacto con un guión gráfico simple de una sola escena, y todo lo que tenía que hacer para solucionarlo era marcar la casilla de verificación "Es controlador de vista inicial" para el controlador de 1 vista en el guión gráfico. Sospecho que Xcode solía marcar esta casilla de forma predeterminada en esta situación, pero ya no lo hace.

Marque la casilla en la parte inferior

                                     

Marque la casilla de exactamente uno de los controladores de vista en su guión gráfico y debería estar bien.

w0mbat
fuente
1
Gracias. ¡Eso fue todo!
Eric Chen
20

Me temo que tendrá que revisar los 30 y verificar si tienen una ID de Storyboard o una transición a ese controlador de vista. Se requiere uno de los dos, ambos también son una opción.

Scott Berrevoets
fuente
5
Después de que todos los controladores de vista tengan su segue o ID, es posible que el mensaje de error aún esté allí. En este caso, limpie el producto y desaparecerá.
Reinhard Männer
5
En mi caso, un producto limpio no fue suficiente para deshacerme del mensaje de error después de que solucioné el error. Desapareció cuando reinicié Xcode. (No intenté cerrar / reabrir el proyecto. Eso puede haber funcionado también)
JulianSymes
Lo mismo para mí: eventualmente debe detener y reiniciar xcode para deshacerse del mensaje de error.
MusiGenesis
8

Este problema puede ocurrir en uno de los siguientes escenarios:

Caso I: si ninguna de las escenas del guión gráfico está marcada como "isInitialViewController" .

Solución: identifique el controlador de vista raíz y márquelo como "isInitialViewController" en su SB. En este caso, la identificación del guión gráfico no es obligatoria.

Caso II

Puede haber situaciones en las que no necesite tener un InitialViewController en un guión gráfico. Por ejemplo: cuando se utilizan varios guiones gráficos.

Solución: en tales casos, asegúrese de que la "identificación del guión gráfico" se proporcione correctamente y consulte la primera escena que se utilizará en el guión gráfico con esta identificación. Por ejemplo:

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

En este caso, la "identificación del guión gráfico" es obligatoria.

Caso III

Tiene su initialViewController conectado. Pero aún recibes esta advertencia. Esto se debe a que algunas de las escenas en el guión gráfico pueden no estar conectadas con una "secuencia" y tampoco tienen una "identificación del guión gráfico" . Escanee su guión gráfico, vea si se necesita una "transición" . Conecte el segue si falta. Si no se necesita una segue, asegúrese de que debe proporcionar una "identificación del guión gráfico", ya que es la única forma de hacer referencia a la escena desde su código, como se muestra en el código de ejemplo anterior.

Espero que esto ayude

shah1988
fuente
CASO III - me ayudó. ¡Gracias!
mrGott
Tuve un caso en el que un proyecto de muestra venía con el antiguo archivo xib. Creé un StoryBoard y actualmente estoy sufriendo ... necesito convertir el xib en formato StoryBoard y moverme desde allí ... no veo ninguna forma de crear una escena de aplicación o un menú ..
nyxee
6

No es necesario configurar Storyboard IDtodas las escenas oUINavigationController

Bueno, tengo alrededor de 50-60 escenas y acabo de recibir estas advertencias para darme cuenta de que solo el controlador (Scene) o NavigationController que no está conectado con segue debe configurarse Storyboard ID.

ingrese la descripción de la imagen aquí

Puede ver que en la imagen de arriba UINavigationControllerno está conectado con segue, fue el culpable de esa advertencia.

Solo dale una ID de Storyboard para eliminar esta advertencia.

Kampai
fuente
5

Tuve el mismo problema. Tengo muchas vistas en mi guión gráfico con un controlador de barra de pestañas y navegación. Para mí, fue solo una advertencia para hacerle saber que algunas de las vistas no están conectadas. Asegúrese de que todas sus vistas estén conectadas de alguna manera al controlador de vista raíz . Estaba comenzando este proyecto desde cero para eliminar esta advertencia y noté la misma advertencia cuando una vista no estaba conectada.

Ricardo
fuente
Esto me ayudó. Estoy usando más de 7.1.1 Swift 2. El StoryBoard inicial TIENE que ser el controlador de vista raíz.
Lukesivi
3

La forma más sencilla de encontrar la escena delictiva:

Vaya al navegador de problemas (en el panel izquierdo, junto al botón de búsqueda) y haga doble clic en el error. Aparecerá una ventana que contiene la escena delictiva centrada en el medio de la ventana.

(En realidad, esto es cierto en general: hacer doble clic en cualquier error generalmente dará como resultado una ventana emergente que contiene el error centrado, ¡un pequeño truco genial!)

Nota al margen: A veces, XCode dará incorrectamente este error para una escena que es el controlador de vista raíz de un controlador de navegación (que es el controlador de vista inicial). Una solución simple es darle a este controlador de vista raíz un Storyboard ID, compilar (el error debería desaparecer) y luego eliminar el storyboardID (ya no hay errores).

ajay14
fuente
Gracias por tu sugerencia "Una solución simple es darle a este controlador de vista raíz una ID de guión gráfico". Resolvió mi problema. Bueno, necesito darle 'Storyboard ID' a UINavigationController.
Mohd Haider
Esto me lleva a la escena de la aplicación con el menú principal. No puedo darle una ID de Storyboard.
Daniel
2

La forma más fácil de ver qué controlador o escena está causando este problema es:

  • Haga Ctrl-clic .storyboarden su en el Navegador de proyectos y seleccione Open As > Source Code. Esto mostrará el XML subyacente del Storyboard.
  • En esta vista, la advertencia estará claramente relacionada con una línea en el XML que se relaciona con la escena delictiva.

Ahora, en mi caso, la advertencia fue particularmente molesta porque la "escena ofensiva" tenía un identificador y una secuencia. Pude solucionar el problema eliminando la escena y luego deshaciendo la eliminación. No elegante, pero trabajado. Guardé mi Storyboard antes de hacer esto. En retrospectiva, debería haber hecho una copia y hacer diffel antes y el después.

Dmitry Minkovsky
fuente
2
Curiosamente, esto no parece funcionar de manera consistente. En mi situación de error, funcionó. Ahora lo estoy probando y la Source Codevista no muestra el error. Por tanto, el kilometraje puede variar.
Dmitry Minkovsky
No encontré el controlador de vista con esto, pero lo eliminé (en XML, no funcionó en ID) y la advertencia desapareció.
Daniel
2

Para mí, no fue por una Storyboard IDo una Segue. Recibí esta advertencia porque no había configurado el View Controller's Custom Class.

Seleccione View Controlleren el Storyboard, luego en el Utilities Pane, seleccione el Identity Inspectoricono. Debajo Custom Class, vea qué valor hay dentro del Classcampo.

Si solo dice UIViewController, entonces debe escribir el nombre de la clase. Este será el nombre de sus archivos .hy .mque componen su UIViewControllersubclase personalizada .

usuario3344977
fuente
Acabo de tener una variación de esto. Coincidí el ViewController incorrecto en mi guión gráfico con la clase ViewController, y lo mismo con el ID del guión gráfico.
Vince O'Sullivan
2

Llegué a esta pregunta hoy. Estoy usando Xcode 6.3 y la respuesta a la pregunta del OP es bastante simple ahora:

Seleccione el controlador de vista que desea que sea el primero, muestre el inspector de atributos y, en la sección Controlador de vista, asegúrese de

Es el controlador de vista inicial

está chequeado. ¡Voilà!

Zonker.in.Geneva
fuente
2

Con Xcode 7, esto se puede manejar fácilmente. No es necesario revisar manualmente todas las escenas para encontrar una problemática. Primero, vaya al navegador de informes , donde puede obtener información más detallada sobre problemas conocidos. La descripción del problema puede verse así:

Base.lproj / Main.storyboard: fPh-fe-F5F : advertencia: No se puede acceder a la escena debido a la falta de puntos de entrada y no tiene un identificador para el acceso en tiempo de ejecución a través de -instantiateViewControllerWithIdentifier :.

Con esta información, puede copiar la identificación del objeto, en este caso era fPh-fe-F5F , y buscar en el espacio de trabajo la aparición de esta cadena. La cadena se encontrará en el archivo Main.storyboard. Haga doble clic en el resultado de la búsqueda y se abrirá Main.storyboard con la escena seleccionada. Una vez que conozca una escena problemática, puede solucionar fácilmente el problema configurando la ID del guión gráfico o configurando "Es el controlador de vista inicial"

Sergio
fuente
1

Puede simplemente establecer un identificador. En el inspector de atributos en el panel derecho, encontrará un campo llamado "Identificador". Simplemente coloque cualquier cuerda allí, esto debería funcionar

Puede hacer clic en el controlador de navegación y, debajo del inspector de atributos, haga clic en el botón "es el controlador de vista inicial", y esto también debería funcionar.

Mohammad Rabi
fuente
1
Mohammad, gracias por responder, pero el problema es: ¿en qué escena debo establecer un identificador? No puedo ubicar la escena que está causando la advertencia, ese es el problema principal.
Wolfy
1

Me enfrenté al mismo problema y resolví poner en el ID del guión gráfico cualquier identificador para todos los viewController y NavigationController también; el error se eliminará de inmediato

¡¡¡disfrutar!!!

Sonic
fuente
0

Quizás este XQuery te ayude a encontrar esas escenas desagradables

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 tiene xqilla instalado, guardaría la consulta en un archivo y lo usaría como

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

No sé si esto no se ha mencionado todavía o no, pero otra razón por la que podría recibir esta advertencia es si tiene una transición que va en la dirección incorrecta. Por ejemplo, en mi proyecto recibí esta advertencia, pero todos mis controladores estaban conectados. Sin embargo, uno de ellos tuvo una transición que básicamente intentaba presentar al padre del niño en lugar de que el padre presentara al niño. Esto provocó la misma advertencia.

miken.mkndev
fuente
0

Recibí esta advertencia cuando tengo un UIViewController en Storyboard en el que no se establece nada. Evité esta advertencia estableciendo Storyboard ID en ella.

Durga Vundavalli
fuente
0

Tuve el mismo problema, pero me di cuenta de que estaba usando la vista de contenedor y, en lugar de eliminar el controlador de vista predeterminado, eliminé su segue, por lo que el controlador de vista permaneció en el guión gráfico y también la advertencia. Entonces, este es uno de los casos en los que aparece una advertencia si el controlador de vista predeterminado de la vista del contenedor no se elimina correctamente cuando no lo necesita.

profundo
fuente
0

Intenté todo lo descrito anteriormente sin éxito. Tenía todo conectado correctamente en IB, con exactamente uno UIViewControllerdesignado como controlador de vista raíz. No tenía identificadores, pero los agregué a todos mis controladores.

La única forma en que podía hacer que desapareciera la advertencia era haciendo todo lo anterior (incluido el reinicio de la computadora y una compilación limpia) y luego cambiando a una rama libre de errores de mi proyecto en git y viceversa.

No estoy seguro de qué acción lo solucionó, o qué combinación de acciones, pero no fue la construcción limpia por sí sola. Esto podría ser un subproducto de Main.storyboard que siempre cambia simplemente al abrirse, lo que significa que tengo que hacerlo git commit -m "Stupid storyboard"más a menudo de lo que deseo.

Corwin Newall
fuente
0

Esto es lo que funcionó para mí:

  1. Abra el guión gráfico en un editor de texto.
  2. Cambie la versión de 3.0 a 2.0, guárdela y ciérrela.
  3. Ábrelo de nuevo en Visual Studio. Automáticamente convertirá y abrirá el documento.
vegas2ny
fuente
0

Recibí el mismo error: para mí, el error fue que no inicié un controlador de vista en mi storyboard.

Arreglar eso eliminó esa advertencia.

Vetri Selvi Vairamuthu
fuente
0

Simplemente dar a todos los MVC una identificación de guión gráfico funcionó para mí.

Elia Döhler
fuente