¿Qué significa esto? “‘NSUnKeyKeyException’, razón: … esta clase no cumple con el código de clave para la clave X”

Estoy intentando 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?

*** Aplicación de finalización debido a la excepción no detectada ‘NSUnKeyKeyException’, razón: ‘[ setValue: forUndefinedKey:]: esta clase no es un valor clave que cumple con la encoding de la clave XXX.’

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

Descargué tu proyecto.

El error que estás recibiendo es

‘NSUnknownKeyException’, razón: ‘[ setValue: forUndefinedKey:]: esta clase no es un valor clave que cumple con la encoding para la cadena clave’.

Es causado por el Second controlador de 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. Invita a una colisión de nombres de tiempo de ejecución. Evítelos incluso en aplicaciones de práctica una vez fuera. 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.

Puede tener una mala conexión en su xib.

He tenido este error muchas veces. Si bien la respuesta de TechZen es correcta en este caso, otra causa común es cuando cambia el nombre de una propiedad de IBOutlet en su .h / .m que ya ha conectado al propietario del archivo en el plumín.

De su punta:

  1. Seleccione el objeto en IB y vaya al ‘Inspector de Conexiones’.
  2. En ‘Hacer referencia a puntos de venta’, asegúrese de que su objeto aún no esté conectado al nombre de la propiedad anterior … si lo está, haga clic en la pequeña ‘x’ para eliminar la referencia y volver a comstackr.

    Ejemplo 1

Otra causa común si está utilizando Storyboard, su UIButton podría tener más de una asignación (Solution es casi la misma que para el plumín):

  1. Abra su guión gráfico y haga clic con el botón secundario en UIButton
  2. Verás que hay más de una asignación / ref de este botón. Elimine una de las ventanas grises “Principal …” con la pequeña “x”:

    ejemplo 2

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

Tuve este error cuando estaba tratando de implementar una ViewCell personalizada para una tabla. Cuando resalté View controller for the XIB y me conecté a los elementos en CellView, ocasioné el error “esta clase no es clave con encoding de valor para la clave”. Una vez que los eliminé, eliminó el error.

Eliminar las conexiones en la imagen de abajo. Eliminar las conexiones en el inspector cuando el propietario del archivo está resaltado

Solo asegúrese de que solo tenga las conexiones con la Celda de vista de tabla. Para marcar, haga clic en la celda de la vista de tabla y en INSPECTOR busque sus conexiones.

La conexión debería estar aquí cuando se resalte Table View Cell

Si se trata de una aplicación exclusiva 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.

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

Mantenga presionada la tecla Control y haga clic en el Propietario de los archivos en el Creador de interfaces si ve un signo de admiración para corregirlo.

En la imagen a continuación, puede ver que “aRemovedView” tiene un signo de admiración a la derecha, es porque eliminé el objeto de vista IBOutlet mientras ya estaba conectado en el IB.

enter image description here

Esto da el siguiente error: Aplicación de finalización debido a la excepción no detectada ‘NSUnKeyKeyException’, razón: ‘[setValue: forUndefinedKey:]: esta clase no es un valor clave que cumple con la encoding para la clave aRemovedView.’

A veces esto tiene que ver con su “Heredar del objective”. Ese valor debe establecerse. Con las aplicaciones de destino único, puede seleccionar Heredar de destino. Si tiene más de un objective, seleccione el objective deseado. enter image description here

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

Eventualmente resolví el problema al vincular la etiqueta a través del Controlador enumerado en Objetos (resaltado en la imagen a continuación) en lugar de a través del Propietario del archivo .

Espero que esto ayude.

enter image description here

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

  1. primero abra su storyboard como código fuente
  2. buscar
  3. eliminar conexiones no deseadas

Por ejemplo:

      

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

Esto me estaba pasando solo cuando estaba depurando en un dispositivo (iPhone). El simulador de iOS funcionaba bien. Hacer un “Producto-> Limpio” de Xcode pareció resolver el problema, pero no tengo idea de por qué.

  1. Solo necesita especificar IBOutlet una vez, la etiqueta IBOutlet su ivar es innecesaria.
  2. ¿Estás instanciando tu NIB usando tu UIViewController ? En algún momento debe llamar a [SecondView initWithNibName:@"yourNibName" bundle:nil];

enter image description hereenter image description here

Mi solución fue similar a la de Gerard Grundy. Al crear una UITableViewCell personalizada usando un XIB, había aplicado erróneamente el nombre de la clase personalizada al propietario del archivo en lugar de al UITableViewCell. Aplicando la clase a la UITableViewCell en el canvas y conectando mis propiedades de IBOutlet, resolvió el problema.

Tuve el mismo mensaje de error y le agradezco (!!) a Kira de http://www.idev101.com. Pude resolver el desafío. Solo encontré su sitio después de googlear y astackr todos estos hilos. Ahora estoy publicando aquí para el siguiente que viene a StackOverFlow y tiene el mismo desafío que tuve, ya que esa persona probablemente vendrá a este hilo sobre Google.

Me di cuenta de que equivocadamente hice esto:

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

En lugar de esto:

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

Dónde

 DeviceViewController 

¿Era 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) donde desea llamar, por ejemplo, otro UIViewController.

No me arrepiento de nada si solo digo lo obvio para principiantes como yo y puedo obtener votos ya que esto no está exactamente relacionado con la pregunta, pero estaba buscando 4 (?!?) Horas seguidas para la respuesta a estos mensajes de error . Si puedo ahorrarle esto a 1 o 2 personas, eso sería genial 🙂

PD: para aquellos interesados ​​en cómo el código continúa para cargar el otro UIViewController:

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

Puede provenir del hecho de que tiene el control arrastrado y creó una salida o acción, y se olvidó de eliminarlo. Incluso si borraste el código, o incluso si has hecho suficiente cmd + Z, deberás ingresar al inspector de conexiones de tu guión gráfico y ver si la acción o la salida que creaste todavía está aquí o no.

Esto me sucede cuando mi controlador de vista originalmente tenía un archivo .xib, pero ahora se crea programáticamente.

Aunque eliminé el archivo .xib de este proyecto. Los usuarios de iPhone / iPad pueden contener un archivo .xib para este controlador de vista.

Intentar cargar un archivo .xib generalmente causa este locking:

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

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

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

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
  • agregó una propiedad @IBInspectable
  • y luego lo eliminó

Entonces también puede obtener un error similar a

Error al establecer (xxx) propiedad inspeccionada definida por el usuario en [Su Vista Personalizada] …: esta clase no cumple con el valor clave de encoding para la clave [xxx].

La solución es eliminar la propiedad anterior.

enter image description here

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 (-).

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 objectives.

Tuve un problema similar para un proyecto que tiene dos objectives (con su propia MainWindow XIB). El problema fundamental que causó este error para mí fue que la clase UIViewController no se incluyó 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 ubicar la clase.

Es decir, haz clic con el botón derecho en la clase UIViewController en cuestión y verifica que esté incluida en la pestaña “Objetivos”.

Ese podría ser el caso de hacer referencia a un componente de la interfaz Xib que haya renombrado o eliminado. La re-referencia funciona para mi.

Acabo de tener este problema en mi proyecto duplicado y lo solucioné marcando 2 lugares:

1- Asegúrate de tener el archivo .m en la lista -> Proyecto – Fases de comstackción – Comstackr fonts
2- Después de eso, ve al constructor de interfaces (probablemente este es un error que solo ocupa IB) y desenlaza todas las propiedades, tags, imágenes, etc. Luego vuelve a vincular todo. Me di cuenta de que eliminé un atributo pero todavía estaba vinculado en IB.

Espero que funcione para algunos.

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 el tiempo de ejecución usaba la otra copia de la clase que no tenía las nuevas claves.

Para encontrar cuál era la copia “correcta” usé el cmd de XCode en el nombre de la clase en otro lugar para saltar a la copia correcta, luego eliminé las malas copias no utilizadas (después de hacer primero mis ediciones de la copia no utilizada).

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

¡Este error es algo más!

Así es como lo solucioné. Estoy usando la versión 6.1.1 de xcode y usando swift. Recibí este error cada vez que mi aplicación intentaba realizar un cambio para pasar a la siguiente pantalla. Aquí lo que hice.

  1. Comprueba que el botón estaba conectado a la acción correcta. (Este no era el problema, pero aún así es bueno verificarlo)
  2. Compruebe que el botón no tenga acciones o salidas adicionales que pueda haber creado por error. (Este no era el problema, pero aún así es bueno verificarlo)
  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 cambio, asegúrese de que tengan un identificador único. (Este fue el problema)
    • Uno de los segmentos no tenía un identificador único
    • Uno de los botones tenía una acción y dos salidas que creé por error.
    • Elimine los puntos de venta adicionales y asegúrese de que los segmentos a la siguiente pantalla tengan identificadores únicos.

Aclamaciones,

Solo para agregar a esto, porque estaba recibiendo este error también. Pasando por todas estas respuestas, la mayoría parece aplicarse al trabajo con la interfaz de usuario y las cosas del guión gráfico. Sé que el póster original parecía estar funcionando con la interfaz de usuario, pero cuando busco las posibles razones para este error, la mayoría de las preguntas me llevan a esta pregunta. Las demás están cerradas como duplicadas 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 encoding de un servicio web en Swift 2. Construí todos los objetos proxy y stubs necesarios. Al pasar por el XML devuelto, estaba creando instancias dinámicas de mis objetos, que procedían de NSObject y usaban setValue:forKey en ellos. Cada vez que setValue:forKey intentó establecer una propiedad, explotó con este error.

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

Eventualmente, empecé a comentar todas estas líneas setValue:forKey y encontré que mi caso default instrucción de conmutación funcionaba para String? .

Finalmente descubrí que no puedes usar tipos rápidos opcionales con setValue:forKey menos que tengan una asignación directa a un tipo Objective-C como String? o NSNumber? . Terminé cambiando todo CShort? tipos a NSNumber? ya que eso tiene un mapeo directo. Para Bool? en mi caso, estaba bien para mí usar Bool e inicializarlo en false . Otros pueden no tener ese lujo.

De todos modos, ¡qué dolor de cabeza era tan afortunado! Esto ayuda a alguien más que tiene un problema similar y sigue siendo redirigido a esta pregunta y se dice a sí mismo: “¡No estoy haciendo nada en la interfaz de usuario!”.

Por lo tanto, para reiterar una vez más, la encoding de clave-valor no funciona con los opcionales. A continuación terminé encontrando algún lugar, pero olvidé dónde, para quien publicó esto, me disculpo y le daré crédito si recuerdo dónde encontré esto, 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 una Int. Opcional; no tiene un puente con Objective-C. Objective-C solo puede ver los tipos que están puenteados a Objective-C:

tipos de clases que se derivan de NSObject

tipos de clase que están expuestos con @objc

Swift structs que están puenteados

“esta clase no es un valor clave que cumpla con la encoding de 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

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

Manera correcta

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

No encontré ninguna respuesta como la anterior, puede ser que pueda ayudar a alguien que tenga el mismo problema

Tuve el mismo síntoma. La causa principal fue que la “Membresía de destino” para mi archivo de origen no estaba configurada en el destino correcto. Supongo que eso significa que mi clase no se comstackrá y se incluirá en mi aplicación.

Para corregirlo:

  1. Resalta tu archivo .m.
  2. En el panel derecho, selecciona el Inspector de archivos.
  3. En la sección “Membresía de destino”, asegúrese de que esté marcado el objective de comstackción apropiado.

Espero que esto ayude a alguien por ahí.

En mi caso. No tuve salidas faltantes en archivos xib después de la fusión.

Shift + Comando + K

resolvió mi problema Limpié mi proyecto y reconstruí.

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

.1 Cambiar la clase a UIViewController

.2 Desconecte todas las salidas (todas tendrán el triángulo amarillo de advertencia ahora) – puede ser suficiente solo para desconectar la (s) salida (s) problemática (s).

.3 Realice todos los pasos estándar – ↑ ⌘K, elimine Datos derivados (, tapetes de oración, cuentas de preocupación)

.4 Inicie la aplicación: vaya a la escena problemática.

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

.6 Vuelva a conectar sus sockets.

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

En mi caso, esto fue causado al hacer referencia al Nib incorrecto:

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

Estaba obteniendo 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, reconectando el cambio y reasignando la clase) que lo solucionó. No sé lo que realmente era, pero había cambiado el nombre de la clase de controlador de vista asociado poco antes de que esto comenzara, por lo que tal vez había rociado algo.

Tengo el mismo problema. Lo reinicié el simulador. Quitando y agregando control de botones. y finalmente hizo una limpieza. 🙂 Gracias al desbordamiento de stack. De alguna forma, mi código se volvió correcto y comenzó a funcionar.