No se pudo crear una instancia de la clase denominada IBNSLayoutConstraint

81

Estoy usando XCode6 beta y probando Swift. Cuando coloco algunas restricciones de diseño automático en un controlador de vista, la aplicación se bloquea con el siguiente error: Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

zbrox
fuente
No hay mucho código para poner aquí :) El controlador de vista es un UIViewController regular recién creado con un par de salidas y los viewDidLoad y didReceiveMemoryWarning regulares. Y luego están las restricciones en Interface Builder. Supongo que puedo agregar el código del controlador de vista aquí.
zbrox

Respuestas:

221

Recibes este error porque estableciste una restricción para un IBOutlet que se elimina en tiempo de ejecución. Esto sucede cuando establece la restricción para que sea un marcador de posición en Interface Builder. Dado que se elimina la restricción, cuando va a desarchivarla, arroja un error que indica que no puede hacerlo.

Hay dos formas de corregir esto.

Método 1

  1. Haga clic derecho en su Storyboard> Abrir como> Código fuente
  2. En el xml del guión gráfico abierto, busque placeholder="YES".
  3. Encontrará restricciones que están configuradas para eliminarse en tiempo de ejecución. Elimine el atributo de marcador de posición de la restricción, guarde y cierre.
  4. Ejecute la aplicación y su problema debería solucionarse.

Método 2

  1. Encuentre la restricción que está causando sus problemas en Interface Builder. Desmarque la opción Marcador de posición en la GUI. Esta debería ser una de las restricciones que se establece en un IBOutlet en ViewController que está causando su bloqueo.

Editor de atributos de Interface Builder que muestra la opción Marcador de posición marcada.

Así es como debería verse:

Editor de atributos de Interface Builder que muestra la opción Marcador de posición sin marcar.

Alternativa

Suponiendo que realmente desea que la restricción sea un marcador de posición, deberá eliminar cualquier toma de referencia. Para hacer esto, seleccione la restricción que desea que sea un marcador de posición. Luego abra el inspector de conexiones (el botón más a la derecha que se ve así: (->)) y luego elimine las salidas de referencia que puedan existir en esa restricción.

Sandy Chapman
fuente
1
¿Qué sucede si desea que la restricción sea un marcador de posición? developer.apple.com/library/ios/documentation/UserExperience/…
Daniel Galasko
2
@DanielGalasko Si quieres que sea un marcador de posición, no lo asignes a un IBOutlet.
Sandy Chapman
@SandyChapman ¡Eso tiene sentido! Muchas gracias Sandy, ¿podrías incluir eso en tu respuesta para que pueda votar?
Daniel Galasko
1
@DanielGalasko, claro. Es un buen punto, mi respuesta fue asumir que querías la restricción en un IBOutlet.
Sandy Chapman
@SandyChapman: ¿Hay alguna manera de averiguar qué restricción está causando esto? Mi proyecto es demasiado grande para poder pasar por cada uno y el volcado de pila no señala qué restricción. Además, traté de buscar placeholder = "YES" pero no pude encontrar ninguno en el xml.
EmbCoder
6

Tuve el mismo problema en este momento y lo siguiente funcionó para mí.

Lancé una versión funcional de mi aplicación en la App Store, volví a trabajar en ella unos días después, tocando una de mis pestañas en UITabBarController y se bloqueó con el error:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

No tenía restricciones de diseño de marcador de posición que conociera ni salidas de restricciones que no deberían haberse definido.

La solución para mí fue simplemente desactivar las clases de tamaño y mantener los datos de la clase de tamaño para iPhone (la aplicación es solo para iPhone). Esto debe haber eliminado todo lo que me había perdido en las clases de tamaño. Quiero clases de tamaño, así que las volví a activar y la aplicación volvió a funcionar.

Philip Moore
fuente
¡Gracias por tu publicación! Simplemente experimenté lo mismo, no cambié nada en mi aplicación. En mi caso, se bloqueó al cargar un 'UIPageViewController'. Desactivar las clases de tamaño y volver a habilitarlas resolvió el error.
nor0x
¡¡Gracias!! Misma experiencia que nor0x. Muy extraño, pero maravilloso encontrar la solución aquí.
Andy Weinstein
4

Esto podría no ser necesariamente un problema de restricción. Para mí, fue causado por no haber marcado "Instalado" para una clase de tamaño que se aplicaba a mi diseño, consulte aquíla instalación debe ser verificada

abinop
fuente
1

Hubo algún problema con el uso de clases de tamaño. Desactivé esa opción de las propiedades del guión gráfico y uso solo el diseño automático. No fue un gran problema ya que la aplicación es solo para iPhone.

zbrox
fuente
Deshabilitar las "Clases de tamaño" y ejecutarlo también lo solucionó. Luego vuelvo a habilitar las clases de tamaño y siguió funcionando.
John Fowler
1

Lo que terminó sucediéndome fue que corté una subvista dentro de Interface Builder para copiarla en otro xib. Esto dejó la subvista en el constructor de interfaz xib original con atenuación. Después de eliminar la subvista de su lugar original (seleccionando y eliminando). Pude deshacerme del error.

wilforeal
fuente
0

Hay una opción en la ventana del inspector cuando selecciona el archivo xib que no usará las restricciones en "Mostrar archivo el inspector" en el inspector llamado "Usar diseño automático".

iPatel
fuente
Sé de ese, pero quiero usar el diseño automático para ese guión gráfico.
zbrox
Gracias. Intenté jugar con ellos, pero realmente no ayudó, ya que también estaba usando clases de tamaño. Pero leeré esto y veré si me perdí algo. Gracias de nuevo.
zbrox
0

Hice un cambio en una vista de desplazamiento para que permitiera que los controles del selector incrustados en ella funcionen correctamente usando una solución que encontré en otra parte de Stackoverflow. Mi nuevo guión gráfico simplemente agregó estos atributos a la vista de desplazamiento, lo que me pareció bien.

     delaysContentTouches="NO" canCancelContentTouches="NO"

Pero además, vi en mi storyboard en otra escena el siguiente fragmento nuevo:

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

No tengo idea de dónde vino. Al principio lo ignoré porque todo parecía funcionar en mi máquina de desarrollo. Pero cuando la compilación se construyó como Release y se probó, me bloqueé. La eliminación de ese fragmento espurio (?) Solucionó el bloqueo y no pareció afectar nada más.

Andy Weinstein
fuente
0

Tuve este problema cuando tenía un botón en una UICollectionViewCell personalizada y tenía algunas de sus restricciones como IBOutlets en esa clase. Moví el botón de la celda al controlador de vista principal y los IBOutlets todavía estaban referenciados en la celda, pero en realidad no existían en la celda, por lo que todo explotó. ¡Solo necesitaba eliminar esos IBOutlets y todo funcionó bien nuevamente!

CMash
fuente