sierra mac high framework features ios macos cocoa cocoa-touch interface-builder

ios - mac - ¿Qué significa esto? “''NSUnknownKeyException'', razón:... esta clase no es compatible con el valor de clave para la clave X”



xcode features (30)

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 de IBOutlet en su .h / .m que ya se ha conectado con el propietario del archivo en la punta.

De su plumilla:

  1. Seleccione el objeto en IB y vaya al ''Inspector de conexiones''.
  2. En "Referencias de puntos de venta", asegúrese de que su objeto todavía no esté conectado al nombre de la propiedad anterior ... si lo está, haga clic en la pequeña "x" para eliminar la referencia y compilar nuevamente.

Otra causa común si utiliza Storyboard, su UIButton puede tener más de una asignación (la solución es casi la misma que para la pluma):

  1. Abre tu guión gráfico y haz clic derecho en UIButton
  2. Verá que hay más de una asignación / referencia a este botón. Quite una de las ventanas en gris "Principal ..." con la "x" pequeña:

Estoy tratando de vincular una UILabel con un IBOutlet creado en mi clase.

Mi aplicación está fallando con el siguiente error. ¿Qué significa esto? ¿Cómo puedo arreglarlo?

*** Aplicación de terminación debido a la excepción no detectada ''NSUnknownKeyException'', razón: ''[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: esta clase no es compatible con el valor de clave para la clave XXX.''


Su controlador de vista puede tener la clase incorrecta en su xib.

Descargué tu proyecto.

El error que está recibiendo es

''NSUnknownKeyException'', razón: ''[<UIViewController 0x3927310> setValue: forUndefinedKey:]: esta clase no es compatible con la codificación de valores clave para la cadena de clave.''

Esto se debe a que el controlador de la Second vista en MainWindow.xib tiene una clase de UIViewController lugar de SecondView . Cambiar a la clase correcta resuelve el problema.

Por cierto, es una mala práctica tener nombres como "cadena" en Objective-C. Se invita a una colisión de nombramiento de tiempo de ejecución. Evitarlos, incluso en aplicaciones de práctica una vez fuera. Nombrar las colisiones puede ser muy difícil de localizar y no quieres perder el tiempo.

Otra posible causa de este error: al copiar y pegar elementos de un controlador a otro, Xcode de alguna manera mantiene ese enlace con el controlador original, incluso después de editar y vincular este elemento con el nuevo controlador.

Otra posible razón para este error:

Mala salida.

Ha eliminado o cambiado el nombre de una salida en su archivo .h.

Elimínelo en el Inspector de conexiones del archivo .xib o .storyboard.


  1. Solo necesita especificar IBOutlet una vez, la etiqueta IBOutlet que su ivar no es necesaria.
  2. ¿Está creando una instancia de su NIB utilizando su UIViewController ? En algún momento debería llamar a [SecondView initWithNibName:@"yourNibName" bundle:nil];

"Esta clase no es clave en cuanto a la codificación." 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

UIViewController* controller = [[UIViewController alloc]initWithNibName:@"TempViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:true];

Forma correcta

TempViewController* controller = [[TempViewController alloc]initWithNibName:@"TempViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:true];

No encontré ninguna respuesta como la anterior, por lo que puede ayudar a alguien con el mismo problema


¡Este error es otra cosa!

Así es como lo arreglé. Estoy usando xcode versión 6.1.1 y usando swift. Recibí este error cada vez que mi aplicación intentaba realizar una sesión para saltar a la siguiente pantalla. Aquí lo que hice.

  1. Verificó que el botón estuviera conectado a la acción correcta. (Este no fue el problema, pero aún así es bueno verificarlo)
  2. Verifique que el botón no tenga acciones o salidas adicionales que pueda haber creado por error. (Este no fue el problema, pero sigue siendo bueno para comprobar)
  3. Verifique los registros y asegúrese de que todos los botones en la PANTALLA SIGUIENTE tengan las acciones correctas y, si hay algún segmento, asegúrese de que tengan un identificador único. (Este fue el problema)
    • Uno de los segues no tenía un identificador único.
    • Uno de los botones tenía una acción y dos salidas que creé por error.
    • Elimine las salidas adicionales y asegúrese de que los segmentos a la siguiente pantalla tienen identificadores únicos.

Aclamaciones,


A veces esto tiene que ver con su "Heredar del objetivo". Ese valor tiene que ser establecido. Con las aplicaciones de un solo objetivo, simplemente puede seleccionar Heredar del objetivo. Si tiene más de un objetivo, seleccione el objetivo deseado.


Acabo de tener este problema en mi proyecto duplicado y se resolvió marcando 2 lugares:

1- Asegúrese de tener el archivo .m en la lista -> Proyecto - Construir fases - Compilar orígenes
2- Después de eso, vaya al generador de interfaces (probablemente se trate de un error que solo ocurre con IB) y desvincule todas las propiedades, etiquetas, imágenes, etc. Luego, vuelva a vincular todo. Me he dado cuenta de que he eliminado un atributo pero aún estaba vinculado en IB.

Espero que funcione para algunos.


En mi caso, esto se debió al hacer referencia a la plumilla incorrecta:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];


En mi caso. No me faltaban salidas en los archivos xib después de la fusión.

Mayús + Comando + K

resuelto mi problema Limpié mi proyecto y lo reconstruí.


Ese podría ser el caso de hacer referencia a un componente de la interfaz Xib que ha cambiado de nombre o que ha eliminado. Re-referenciación funciona para mí.


Estaba recibiendo este error con 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, volviendo a conectar 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 asociado poco antes de que esto comenzara, así que tal vez eso había cambiado algo.


Este error indica que un objeto Interface Builder ya conectado se elimina / cambia de nombre en la fuente de su propietario (Propietario del archivo).

Presione la tecla Control y haga clic en el Propietario de los archivos en el Generador de interfaces si ve un signo de exclamación que necesita para solucionarlo.

En la imagen de abajo, puede ver que "aRemovedView" tiene un signo de exclamación a su derecha, porque eliminé el objeto de vista de IBOutlet cuando ya estaba conectado en el IB.

Esto da el siguiente error: la aplicación se cerró debido a la excepción no detectada ''NSUnknownKeyException'', razón: ''[setValue: forUndefinedKey:]: esta clase no es compatible con la codificación de valores de clave para la clave aRemovedView.''


Esto me estaba sucediendo solo al depurar en un dispositivo (iPhone). El simulador de iOS estaba funcionando bien. Hacer un "Producto-> Limpiar" de Xcode parecía resolver el problema, pero no tengo idea de por qué.


Esto me sucede cuando mi controlador de vista originalmente tenía un archivo .xib, pero ahora se crea mediante programación.

A pesar de que he eliminado el archivo .xib de este proyecto. Los usuarios de iPhone / iPad pueden contener un archivo .xib para este controlador de vista.

El intento de cargar un archivo .xib suele provocar este bloqueo:

Terminating app due to uncaught exception ''NSUnknownKeyException'', reason: ''[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.''

La solución al crearlo programáticamente puede ser esta:

-(void)loadView { // Ensure that we don''t load an .xib file for this viewcontroller self.view = [UIView new]; }


La propiedad "Módulo" de View Controller en el inspector de identidad puede ser diferente de lo que esperaba. También asegúrese de que las nuevas clases se agreguen a su lista de objetivos.


Mirando las otras respuestas, parece que hay muchas cosas que pueden causar este error. Aquí hay uno más.

Si tu

  • tener una vista personalizada
  • añadida una propiedad @IBInspectable
  • y luego lo borro

Entonces también puede obtener un error similar a

Error al establecer (xxx) la propiedad inspeccionada definida por el usuario en [Su vista personalizada] ...: esta clase no es compatible con el valor de clave para la clave [xxx].

La solución es eliminar la propiedad antigua.

Abra el inspector de identidad de 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 (-).


Otro problema "no compatible" que encontré fue cuando logré tener dos copias de una clase por algún motivo.

Estaba agregando llaves a la copia incorrecta. Interface Builder aún vio las claves y me permitió conectarme a ellas, pero en el tiempo de ejecución estaba utilizando la otra copia de la clase que no tenía las nuevas claves.

Para encontrar cuál era la copia "correcta", utilicé el cmd-clic de XCode en el nombre de la clase en otra parte para saltar a la copia correcta, luego eliminé las copias no utilizadas mal (después de traer mis ediciones de la copia sin usar primero).

Moraleja de la historia: los archivos de clase duplicados son malos.


Puede deberse al hecho de que usted ha arrastrado el control y creado una salida o acción, y se olvidó de eliminarlo. Incluso si eliminó el código, o incluso si ha creado suficiente cmd + Z, deberá ingresar al inspector de conexión de su guión gráfico y ver si la acción o la salida que creó todavía está aquí o no.


Recibí exactamente el mismo mensaje de error y gracias (!!) a Kira de http://www.idev101.com pude resolver el desafío. Solo encontré su sitio después de buscar en Google y apilar sobre todos estos hilos. Ahora publico aquí para el próximo que viene a y tiene el mismo desafío que tuve ya que esa persona probablemente llegará a este hilo en Google.

Me di cuenta, que hice esto erróneamente:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

En lugar de esto:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Dónde

DeviceViewController

Fue el nombre de mi clase también conocido como

DeviceViewController.h DeviceViewController.m

Tendrás que

"import DeviceViewController.h"

en su implementación (archivo .m) a la que desea llamar, por ejemplo, otro UIViewController.

No me arrepiento en absoluto si solo digo lo obvio para los principiantes como yo y puedo obtener votos porque esto no está exactamente relacionado con la pregunta, pero estaba buscando 4 (?!?) Horas seguidas para obtener la respuesta a este mensaje de error. . Si puedo ahorrarle 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:

[self presentViewController:deviceViewController animated:YES completion:nil];


Si se trata de 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 especificas un xib ahí se bloquea.


Si tiene una subclase UIViewController personalizada con IBOutlets que están causando problemas, el único conjunto de pasos que encontré para eliminar realmente el error fue

.1 Cambia la clase a UIViewController

.2 Desconecte todos los tomacorrientes (ahora todos tendrán el triángulo de advertencia amarillo): puede ser suficiente simplemente para desconectar los tomacorrientes problemáticos.

.3 Realice todos los pasos estándar - ↑ ⌘K, elimine Datos Derivados (, esteras de oración, cuentas de preocupación)

.4 Lanzar la aplicación - ir a la escena problemática.

.5 Cancele la aplicación, vuelva a Interface Builder y cambie la clase a su nombre de clase personalizado.

.6 Vuelva a conectar sus puntos de venta.

Inicie la aplicación y esto normalmente habrá solucionado los problemas de cumplimiento de clave-valor.


Solo para agregar a esto, porque también estaba recibiendo este error. El repaso de todas estas respuestas parece aplicarse al trabajo con la interfaz de usuario y el guión gráfico. Sé que el póster original parecía estar funcionando con la interfaz de usuario, pero cuando busco las posibles causas de este error, la mayoría de las preguntas conducen a esta pregunta, y las otras están cerradas como duplicados o simplemente tienen problemas para conectar cosas en un guión gráfico. Añadir mi solución.

Estaba trabajando en la codificación de un servicio web en Swift 2. Había construido todos los objetos proxy necesarios y los talones. Mientras recorría el XML devuelto, estaba creando una instancia dinámica de mis objetos, que provenían de NSObject y usaban setValue:forKey en ellos. Cada vez que setValue:forKey intentaba establecer una propiedad, explotó con este error.

Tuve una declaración de cambio para cada tipo con el que estaba tratando (por ejemplo, Bool? CShort? String? ) Y para cada nodo XML revisé qué tipo estaba en el objeto y luego convertí el valor a ese tipo e intenté para configurarlo con setValue:forKey .

Finalmente, comencé a comentar todos estos setValue:forKey y encontré que mi caso default instrucción de cambio funcionó para String? .

Finalmente, me di cuenta de que no puedes usar tipos swift opcionales con setValue:forKey menos que tengan una asignación directa a un tipo Objective-C como String? o NSNumber? . Terminé cambiando todos los CShort? tipos para NSNumber? ya que tiene un mapeo directo. ¿Para Bool? en mi caso estaba bien para mí simplemente usar Bool e inicializarlo en false . Otros pueden no tener ese lujo.

De todos modos, qué dolor de cabeza fue tan esperanzador que esto ayude a otra persona que tiene un problema similar y se redirige a esta pregunta y se diga a sí mismos: "¡No estoy haciendo nada en UI!".

Por lo tanto, para reiterar una vez más, la codificación de clave-valor no funciona con las opciones. A continuación, encontré un lugar pero me olvido de dónde lo hice. Quien haya publicado esto, me disculpo y le daría crédito si recordara dónde lo encontré pero me salvó la vida:

No puede usar KVC en una propiedad Int opcional, porque KVC es Cocoa / Objective-C, y Objective-C no puede ver un Int opcional, no está enlazado a Objective-C. Objective-C solo puede ver los tipos que están enlazados a Objective-C:

tipos de clases que se derivan de NSObject

Tipos de clases que se exponen con @objc

Estructuras rápidas que están puenteadas


Tengo el mismo problema. Yo reinicié el simulador. Eliminando y añadiendo el botón de control. y finalmente hizo una limpieza. :) Gracias a la pila de desbordamiento. Algunos de cómo mi código se convirtió en aceptable y empezando a trabajar.


Tuve el mismo problema y aunque la respuesta de TechZen puede ser sorprendente, me resultó difícil aplicarlo a mi situación.

Finalmente, resolví el problema vinculando la etiqueta a través del Controlador que se enumera en Objetos (resaltado en la imagen a continuación) en lugar de hacerlo a través del Propietario del archivo .

Espero que esto ayude.


Tuve el mismo síntoma. La causa principal fue que la "Membresía de destino" para mi archivo de origen no se configuró 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:

  1. Resalte su archivo .m.
  2. En el panel derecho, seleccione el inspector de archivos.
  3. En la sección "Membresía objetivo", asegúrese de que el objetivo de compilación adecuado esté marcado.

Espero que esto ayude a alguien por ahí.


Tuve este error cuando intentaba implementar un ViewCell personalizado para una tabla. Cuando resalté Ver controlador para el XIB y conecté a los elementos en el CellView causé el error "esta clase no es clave de codificación de valor clave para la clave" una vez que eliminé esto, se eliminó el error.

Eliminar las conexiones en la imagen de abajo.

Solo asegúrese de que solo tiene 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.


Tuve que eliminar la aplicación del simulador / iPhone para deshacerme de este error.


Tuve un problema similar para un proyecto que tiene dos objetivos (con su propia MainWindow XIB). El problema fundamental que causó este error para mí fue que la clase UIViewController no estaba incluida en la lista de recursos del segundo proyecto. Es decir, el constructor 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 en cmd en la clase UIViewController en cuestión y vuelva a verificar que esté incluido en la pestaña ''Objetivos''.


en mi caso, fue un error en el código fuente del guión gráfico, siga estos pasos:

  1. Primero abre tu storyboard como código fuente
  2. buscar <connections>
  3. eliminar conexiones no deseadas

Por ejemplo:

<connections> <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/> <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/> <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/> </connections>

Como puede ver, estas son conexiones entre los nombres de las variables de código y las etiquetas xml de diseño del guión gráfico;)


Mi solución fue similar a la de Gerard Grundy. Al crear un UITableViewCell personalizado utilizando un XIB, había aplicado erróneamente el nombre de la Clase personalizada al Propietario del archivo en lugar de al UITableViewCell. La aplicación de la clase al UITableViewCell en el lienzo y la conexión de las propiedades de mi IBOutlet resolvió el problema.