Estoy tratando de vincular un UILabel
con un IBOutlet
creado en mi clase.
Mi aplicación se bloquea con el siguiente error.
¿Qué significa esto?
¿Cómo puedo arreglarlo?
*** Finalización de la aplicación debido a la excepción no detectada 'NSUnknownKeyException', razón: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: esta clase no es compatible con la codificación del valor de clave para la clave XXX'.
ios
macos
cocoa
cocoa-touch
interface-builder
Guillaume Dubois
fuente
fuente
Respuestas:
Su controlador de vista puede tener la clase incorrecta en su xib.
Descargué tu proyecto.
El error que está recibiendo es
Es causado por el
Second
controlador de vista alMainWindow.xib
tener una clase de enUIViewController
lugar deSecondView
. Cambiar a la clase correcta resuelve el problema.Por cierto, es una mala práctica tener nombres como "string" en Objective-C. Invita a una colisión de nombres de tiempo de ejecución. Evítelos incluso en aplicaciones de práctica. Nombrar colisiones puede ser muy difícil de rastrear y no quiere perder el tiempo.
Otra posible razón de este error: al copiar y pegar elementos de un controlador a otro, Xcode de alguna manera mantiene ese enlace al controlador original, incluso después de editar y volver a vincular este elemento en el nuevo controlador.
Otra posible razón de este error:
Mal Outlet.
Has eliminado o renombrado un nombre de salida en tu
.h
archivo.Y eliminar en
.xib
o.storyboard
conexión de archivo Inspector.Una razón más posible
(En mi caso) Extensión de UIView con propiedades enlazables y valores de configuración para esas propiedades enlazables (es decir, sombra, radio de esquina, etc.) luego elimine esas propiedades de la extensión UIView (por alguna razón), pero lo siguiente
<userDefinedRuntimeAttributes>
permaneció en xml (defoo.storyboard
):Solución: haga clic con el botón derecho en
foo.storyboard
> Abrir como código fuente> busque por keyPath (es decir, shadowRadius)> Elimine el</userDefinedRuntimeAttributes>
que causa el problemafuente
Es posible que tenga una mala conexión en su xib.
He tenido este error muchas veces. Si bien la respuesta de TechZen es absolutamente correcta en este caso, otra causa común es cuando cambia el nombre de una propiedad IBOutlet en su .h / .m que ya ha conectado al propietario del archivo en la punta.
De tu punta:
En 'Salidas de referencia', asegúrese de que su objeto todavía no esté conectado al nombre de la propiedad anterior ... si es así, haga clic en la pequeña 'x' para eliminar la referencia y compilar nuevamente.
Otra causa común si está usando Storyboard, su UIButton podría tener más de una asignación (la solución es casi la misma que para la punta):
Verá que hay más de una asignación / referencia a este botón. Elimine una de las ventanas en gris "Principal ..." con la pequeña "x":
fuente
Tuve que eliminar la aplicación del simulador / iPhone para deshacerme de este error.
fuente
Tuve este error cuando intentaba implementar una ViewCell personalizada para una tabla. Cuando resalté el controlador de vista para el XIB y me conecté a los elementos en CellView causó el error "esta clase no es compatible con la codificación del valor de clave para la clave" una vez que los eliminé, eliminé el error.
Elimine las conexiones en la imagen a continuación.
Solo asegúrese de tener solo las conexiones con la celda de vista de tabla. Para verificar, haga clic en la celda de vista de tabla y en INSPECTOR busque sus conexiones.
fuente
A veces esto tiene que ver con su "Heredar del objetivo". Ese valor debe establecerse. Con las aplicaciones de destino único, puede seleccionar Heredar del destino. Si tiene más de un objetivo, seleccione el objetivo deseado.
fuente
Si es una aplicación solo para iPhone, no universal, asegúrese de que el siguiente campo esté vacío:
Objetivos> Resumen> Información de implementación de iPhone / iPod> Interfaz principal
Si especifica un xib allí, se bloquea.
fuente
Este error indica que un objeto de Interface Builder ya conectado se elimina / renombra en la fuente de su propietario (Propietario del archivo).
Mantenga presionada la tecla Control y haga clic en Propietario de archivos en el Creador de interfaces si ve un signo de exclamación que necesita corregir.
En la imagen a continuación, puede ver que "aRemovedView" tiene un signo de exclamación a su derecha, eso es porque eliminé el objeto de vista IBOutlet mientras ya estaba conectado en el IB.
Esto da el siguiente error: Finalización de la aplicación debido a la excepción no detectada 'NSUnknownKeyException', razón: '[setValue: forUndefinedKey:]: esta clase no es compatible con la codificación del valor de clave para la clave aRemovedView'.
fuente
Tuve el mismo problema y, aunque la respuesta de TechZen puede ser realmente sorprendente, me resultó difícil aplicarla a mi situación.
Finalmente, resolví el problema vinculando la etiqueta a través del Controlador que aparece en Objetos (resaltado en la imagen a continuación) en lugar de hacerlo a través del Propietario del archivo .
Espero que esto ayude.
fuente
en mi caso fue un error en el código fuente del guión gráfico, siga estos pasos:
<connections>
Por ejemplo:
Como puede ver, estas son conexiones entre los nombres de las variables de código y las etiquetas xml del diseño del guión gráfico;)
fuente
Mi solución fue similar a la de Gerard Grundy. Al crear un UITableViewCell personalizado usando un XIB, había aplicado por error el nombre de la Clase personalizada al Propietario del archivo en lugar de al UITableViewCell. La aplicación de la clase a UITableViewCell en el lienzo y la conexión de mis propiedades IBOutlet resolvió el problema.
fuente
IBOutlet
una vez, elIBOutlet
etiqueta de su ivar es innecesaria.UIViewController
? En algún momento deberías estar llamando[SecondView initWithNibName:@"yourNibName" bundle:nil];
fuente
-initWithNibName
con el nombre de plumín equivocado.Esto me sucedía solo cuando depuraba en un dispositivo (iPhone). El simulador de iOS funcionaba bien. Hacer un "Producto-> Limpiar" desde Xcode parecía resolver el problema, pero no tengo idea de por qué.
fuente
Tuve exactamente el mismo mensaje de error y gracias (!!) a Kira desde http://www.idev101.com pude resolver el desafío. Solo encontré su sitio después de buscar en Google y apilar todos estos hilos. Ahora estoy publicando aquí para el próximo que llega a StackOverFlow y tiene el mismo desafío que tuve ya que esa persona probablemente llegará a este hilo sobre Google.
Me di cuenta de que hice esto erróneamente:
En lugar de esto:
Dónde
¿Era el nombre de mi clase también conocido como
Tendrás que
en su implementación (archivo .m) donde desea llamar, por ejemplo, otro UIViewController.
No me arrepiento de nada si solo estoy declarando lo obvio para principiantes como yo y puedo obtener votos, ya que esto no está exactamente relacionado con la pregunta pero estaba buscando 4 (?!?) Ahora para la respuesta a este mensaje de error . Si puedo ahorrar esto a 1 o 2 personas, sería genial :)
PD: Para aquellos interesados en cómo continúa el código para cargar el otro UIViewController:
fuente
Puede provenir del hecho de que tiene el control arrastrado y creado una salida o acción, y se olvidó de eliminarlo. Incluso si eliminó el código, o incluso si ha realizado suficientes cmd + Z, deberá ir al inspector de conexiones de su guión gráfico y ver si la acción o la salida que creó todavía está aquí o no.
fuente
Mirando las otras respuestas, parece que hay muchas cosas que pueden causar este error. Aquí hay uno más.
Si tu
Entonces también puede obtener un error similar a
La solución es eliminar la propiedad anterior.
Abra el inspector de identidad para su clase, seleccione el nombre de la propiedad en Atributos de tiempo de ejecución definidos por el usuario y presione el botón menos (-).
fuente
Esto me sucede cuando mi controlador de vista originalmente tenía un archivo .xib, pero ahora se crea mediante programación.
Aunque he eliminado el archivo .xib de este proyecto. Los usuarios iPhone / iPad pueden contener archivos .xib para este controlador de vista.
Intentar cargar un archivo .xib generalmente causa este bloqueo:
La solución al crearla mediante programación puede ser esta:
fuente
La propiedad "Módulo" de View Controller en Identity Inspector puede ser diferente de lo que esperaba. También asegúrese de agregar nuevas clases a su lista de objetivos.
fuente
Tuve un problema similar para un proyecto que tiene dos objetivos (con su propia MainWindow XIB). El problema fundamental que me causó este error fue que la clase UIViewController no estaba incluida en la lista de recursos del segundo proyecto. Es decir, el generador de interfaces me permitió especificarlo en MainWindow.xib, pero en tiempo de ejecución el sistema no pudo localizar la clase.
Es decir, haga clic y haga clic en la clase UIViewController en cuestión y verifique que esté incluida en la pestaña 'Objetivos'.
fuente
Solo para agregar a esto, porque también recibí este error. Revisar todas estas respuestas parece aplicarse a trabajar con la interfaz de usuario y el material del guión gráfico. Sé que el póster original parecía estar funcionando con la interfaz de usuario, pero al buscar posibles razones para este error, la mayoría de las preguntas vuelven a esta pregunta con los otros cerrados como duplicados o simplemente tienen problemas para conectar cosas en un guión gráfico, así que lo haré agrega mi solución
Estaba trabajando en la codificación de un servicio web en Swift 2. Había creado todos los objetos proxy y apéndices necesarios. Mientras recorría el XML devuelto, estaba creando instancias dinámicas de mis objetos, de los cuales todos provenían
NSObject
y los utilizabasetValue:forKey
. Cada vezsetValue:forKey
trató de establecer una propiedad, explotó con este error.Tenía una sentencia switch para cada tipo que estaba tratando con (por ejemplo
Bool?
,CShort?
,String?
) y para cada nodo XML que revisé y verifiqué qué tipo estaba en el objeto y luego convertí el valor a ese tipo e intenté configurarlosetValue:forKey
.Finalmente comencé a comentar todas estas
setValue:forKey
líneas y descubrí que midefault
caso de declaración de cambio funcionó paraString?
.Finalmente descubrí que no puedes usar tipos rápidos opcionales con a
setValue:forKey
menos que tengan una asignación directa a un tipo Objective-C comoString?
oNSNumber?
. Terminé cambiando todos losCShort?
tiposNSNumber?
ya que eso tiene una asignación directa. EnBool?
mi caso, estaba bien usarloBool
e inicializarlofalse
. Otros pueden no tener ese lujo.De todos modos, qué dolor de cabeza fue tan esperemos que esto ayude a alguien más que tiene un problema similar y sigue siendo redirigido a esta pregunta y diciéndose a sí mismos: "¡No estoy haciendo nada en la interfaz de usuario!".
Por último, para reiterar una vez más, la codificación de valores clave no funciona con opciones. A continuación, terminé encontrando un lugar, pero olvido dónde, así que a quien haya publicado esto, me disculpo y agradecería si recordara dónde encontré esto, pero me salvó la vida:
fuente
"esta clase no es compatible con la codificación de valores clave para la clave" Sé que es un poco tarde, pero mi respuesta es diferente, así que creo que debe publicarse, estaba presionando el segundo controlador de manera incorrecta. Aquí hay una muestra
Manera incorrecta de empujar el controlador
Forma correcta
No encontré ninguna respuesta como la anterior, por lo que puede ayudar a alguien que tenga el mismo problema
fuente
Ese podría ser el caso de hacer referencia a un componente de la interfaz Xib que ha renombrado o eliminado. Re-referenciar funciona para mí.
fuente
Acabo de tener este problema en mi proyecto duplicado y lo resolví marcando 2 lugares:
1- Asegúrese de tener el archivo .m en la lista -> Proyecto - Fases de compilación - Compilar fuentes
2- Después de eso, vaya al generador de interfaces (probablemente este sea un error con solo IB) y desvincule todas las propiedades, etiquetas, imágenes , etc ... Luego, vuelva a vincular todo. Me di cuenta de que eliminé un atributo pero aún estaba vinculado en IB.
Espero que funcione para algunos.
fuente
Otro problema "no conforme" que encontré fue cuando logré tener dos copias de una clase por alguna razón.
Estaba agregando claves a la copia incorrecta. Interface Builder todavía vio las claves y me permitió conectarme a ellas, pero en tiempo de ejecución estaba usando la otra copia de la clase que no tenía las nuevas claves.
Para encontrar cuál era la copia "correcta", utilicé el cmd de XCode, haga clic en el nombre de la clase en otro lugar para saltar a la copia correcta, luego eliminé las copias no utilizadas malas (después de traer primero mis ediciones de la copia no utilizada).
Moraleja de la historia: los archivos de clase duplicados son malos.
fuente
Este error es otra cosa!
Así es como lo arreglé. Estoy usando xcode Versión 6.1.1 y estoy usando swift. Recibí este error cada vez que mi aplicación intentó realizar una segue para saltar a la siguiente pantalla. Aquí lo que hice.
Salud,
fuente
Tuve el mismo síntoma. La causa raíz fue que la "Membresía de destino" para mi archivo fuente no estaba configurada en el destino correcto. Supongo que eso significa que mi clase no se construiría ni se incluiría en mi aplicación.
Para corregirlo:
Espero que esto ayude a alguien por ahí.
fuente
Si tiene una subclase UIViewController personalizada con IBOutlets que están causando problemas, el único conjunto de pasos que encontré para deshacerme del error fueron
.1 Cambiar la clase a UIViewController
.2 Desconecte todas las salidas (todas tendrán el triángulo de advertencia amarillo ahora); puede ser suficiente desconectar las salidas problemáticas.
.3 Realice todos los pasos estándar: ↑ ⌘K, elimine los datos derivados (alfombras de oración, cuentas de preocupación)
.4 Inicie la aplicación: vaya a la escena problemática.
.5 Elimine la aplicación, regrese a Interface Builder y cambie la clase a su nombre de clase personalizado.
.6 Vuelva a conectar sus enchufes.
Inicie la aplicación y esto normalmente habrá solucionado los problemas de cumplimiento del valor clave.
fuente
En mi caso. No me faltaban salidas en los archivos xib después de la fusión.
resuelto mi problema Limpié mi proyecto y lo reconstruí.
fuente
En mi caso, esto fue causado al hacer referencia al Nib incorrecto:
fuente
Estaba recibiendo este error con los guiones gráficos. La solución anterior no parecía ser el problema, así que terminé eliminando el controlador de vista y volviéndolo a agregar (y, por supuesto, reconectando el segmento y reasignando la clase) que lo solucionó. No sé qué era realmente, pero había cambiado el nombre de la clase de controlador de vista asociada poco antes de que esto comenzara, así que tal vez eso había manchado algo.
fuente
Tengo el mismo problema. Restablecí el simulador. Eliminar y agregar control de botones. y finalmente hizo una limpieza. :) Gracias al desbordamiento de pila. De alguna manera, mi código se volvió correcto y comenzó a funcionar.
fuente