Xcode - Cómo arreglar 'NSUnknownKeyException', razón: ... esta clase no es compatible con la codificación del valor clave para el error clave X "?

1172

Estoy tratando de vincular un UILabelcon un IBOutletcreado 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'.

Guillaume Dubois
fuente
11
pedrotorres tiene razón. Si, esto es correcto. Si está haciendo un UITableViewCell, en IB recuerde hacer que el Propietario del archivo sea NSObject, y el UITableViewCell'Class a la clase .h que definió.
giuseppe
3
Cuando encuentre un problema de este tipo y la clave ofensiva sea una acción en lugar de una salida , lo más probable es que tenga una salida que haga referencia erróneamente al nombre de la función de acción en lugar del nombre de la variable de salida .
Alex Yursha
2
Debería notar que el nombre de la clave en el mensaje de error (el OP lo llama 'XXXX') es el nombre que le dio a algo en su archivo plumín. Eso debería ayudar a reducir su búsqueda.
kris
Archivé rdar: // 22105925 pidiéndole a Apple que haga estos errores más obvios en el momento de la compilación. :)
jtbandes
¡Cómo resolver INMEDIATAMENTE el problema! stackoverflow.com/a/13812660/294884 fantástico consejo
Fattie

Respuestas:

980

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 del valor de clave para la cadena de clave'.

Es causado por el Secondcontrolador de vista al MainWindow.xibtener una clase de en UIViewControllerlugar 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 .harchivo.

Y eliminar en .xibo .storyboardconexió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 (de foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

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 problema

Hassan Tareq
fuente
99
Además, no olvide conectar la salida de "vista" de la plumilla a la salida de vista del propietario del archivo (la salida de vista de su clase personalizada heredada de UIViewController). Esto se puede hacer arrastrando el control desde "Propietario del archivo" en "Colocar titulares" hasta "ver" en "Objetos" y seleccionando la vista de salida.
Nirma
1
Me he asegurado de que toda la clase ya esté configurada, pero la NSUnknownKeyException todavía sale :(
Zennichimaro
1
Ni siquiera estoy usando Interface Builder, y sigo recibiendo este error. ¿Tienes idea de lo que está pasando?
sudo
12
No importa. Fue debido a dos cosas: Xcode todavía estaba accediendo a mi guión gráfico principal a pesar de que se eliminó del proyecto, y el simulador lo tenía en caché. No recomiendo el uso de guiones gráficos o NIB, son ridículamente problemáticos.
sudo
55
@Josh Lol. Cada vez que trabajo con la motivación para crear una aplicación nativa en xcode, siempre termina con pasar un día tratando de descubrir cómo hacer algo. Soy ac # dev, así que últimamente he estado buscando ofertas de Xamarin y Telerik (nativescript).
The Muffin Man
1524

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:

  1. Seleccione el objeto en IB y vaya al 'Inspector de conexiones'.
  2. 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.

    ingrese la descripción de la imagen aquí

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):

  1. Abra su guión gráfico y haga clic derecho en el botón UIB
  2. 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":

    ejemplo 2

OhadM
fuente
1
¡Gracias! En mi caso, tenía 2 salidas para la misma vista, y deshacerme de la anterior y conectar la vista a la nueva puso fin a la excepción.
Mark Patterson
la mía fue duplicada dos veces. Comencé a desconectar cada uno después de arrastrar y soltar desde una versión Pro (desde una versión Lite) pensando que estaba colgando de conexiones en el otro proyecto. Cuando encontré el duplicado, y me tomó 3 clics hacer la desconexión, sinceramente deseé haberlo hecho 3 días antes. Oh bueno, así es la vida de un desarrollador.
aremvee
Tuve el problema de que UIButton tenía más de una asignación. Esto resolvió mi problema.
mythicalcoder
Yo tuve este problema también. No olvide verificar las conexiones de salida en vistas particulares en lugar de solo supervistas. En mi caso, las supervistas no mostraban las conexiones incorrectas = /
Augusto Carmo
Tuve un error similar cuando conecté una salida de botón a un archivo Swift de ViewController incorrecto cuya página aún no se habría creado utilizando la GUI
brw59
114

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

Steve Rogers
fuente
1
+1 esto me lo arregló. Estaba limpiando un código que usaba IB. Cuando eliminé un botón del código, el error seguía apareciendo incluso cuando este botón no estaba referenciado en absoluto en los archivos de plumín (al menos eso podía ver).
Domingo lunes
2
Creo que esto es necesario si está depurando dos aplicaciones que tienen el mismo nombre.
Anton
Sí, parece que algo del XIB está almacenado en caché en el simulador, lo cual es una molestia si estás probando actualizaciones ya que en realidad no quieres tener que eliminar la aplicación anterior.
Carlos P
Tuve este problema al eliminar mi archivo XIB. Esto solucionó el problema.
balboa
44
Si eliminar la aplicación no funciona, intente eliminar la carpeta XCode DerivedData. que puede almacenar en caché un archivo xib incorrecto. Abra XCode -> Preferencias -> Ubicaciones -> Abra la carpeta DerivedData y arrástrela a la Papelera.
Philip Fung
107

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. Elimine las conexiones en el inspector cuando el propietario del archivo esté resaltado

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.

La conexión debe estar aquí cuando la celda de vista de tabla está resaltada

uplearnedu.com
fuente
44
Esto lo hizo por mí, muchas gracias. Extendí las conexiones cuando seleccioné "Propietario del archivo" en la columna izquierda, luego seleccioné mi celda personalizada y las volví a unir. ¡Éxito!
Rogare
Incluso con xcode7 esto funciona, simplemente use el panel derecho "Inspector de conexiones". Retire la salida de la celda de viewview y de la etiqueta, luego vuelva a agregarla y todo debería funcionar.
lifeisfoo
3
¡Esto funciona pero debes asegurarte de que FileOwner no se haya configurado! El propietario del archivo debe seguir siendo NSObject. stackoverflow.com/questions/13793162/…
devjme
¡La misma respuesta me salvó dos veces!
wm.p1us
99

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.

ingrese la descripción de la imagen aquí

Shruti Thombre
fuente
Esta respuesta me ayudó para un caso específico. Tengo que seguir trabajando en un viejo proyecto obj-c con múltiples objetivos. Creo un UITableViewCell personalizado en Swift y tuve el mismo error. Al habilitar "Heredar del objetivo" funcionó. ¡Gracias!
magohamoth
El módulo no siempre está configurado correctamente; por ejemplo, si completa el nombre de la clase antes de crear la clase.
Johan
He completado el nombre de la clase sin presionar la tecla "Enter" al final, por lo que el IDE no verificó esta bandera automáticamente. Perdí 1 hora en esto. Gracias.
MatPag
Nunca encontré este tipo de error en obj-c. Pero gracias está resuelto el misterio.
Pradeep Kachhawaha
¿Por qué está enterrado en la tercera página?
Sergio
65

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.

erkanyildiz
fuente
2
Sí, eso fue todo para mí. Mientras me agitaba para agregar un nuevo controlador de vista de inicio, configuré esto en la nueva clase / punta. Después de conectar la salida de la vista, recibí este error. Borrar este campo lo arregló.
terriblememory
Esto funcionó para mí. Tenga en cuenta que también tuve que eliminar la versión anterior del dispositivo / simulador para que funcione.
jimt
Gracias, este fue mi problema. Cambié el nombre de mi archivo de storyboard de iPad y no actualicé las preferencias de mi proyecto.
RobertJoseph
2
¡Gracias! Esto lo resolvió para mí. (Tuve que eliminar la aplicación del simulador después de cambiar el campo de interfaz principal para estar vacío Simplemente cambiando ese campo no forzó el simulador para romper el caché..)
snipe
¡Recordé que cambié las cosas de una aplicación universal a una aplicación solo para iPhone y esto solucionó el error!
Justin
59

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.

ingrese la descripción de la imagen aquí

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

Tibidabo
fuente
¡Gracias! Esto me lo arregló. He tenido este problema durante mucho tiempo y no sabía cómo solucionarlo, aparte de comenzar desde cero. Esto fue todo, eliminó IBOutlets del controlador de vista, pero no sabía que todavía estaban referenciados / vinculados en el propietario (en este caso, "Controlador de vista" en el generador de interfaces - Xcode 6).
Ira Herman
41

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.

ingrese la descripción de la imagen aquí

Eric Brotto
fuente
37

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 del diseño del guión gráfico;)

tarifa namrouti
fuente
33

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

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.

asco
fuente
Ayyy dag nab it ... No puedo creer con qué frecuencia cometo este error. Gracias lol
Benjamin
31
  1. Solo necesita especificar IBOutletuna vez, elIBOutlet etiqueta de su ivar es innecesaria.
  2. ¿Está creando instancias de su NIB usando su UIViewController? En algún momento deberías estar llamando[SecondView initWithNibName:@"yourNibName" bundle:nil];
kubi
fuente
Esto ayudó! Estaba recibiendo un error de cumplimiento de codificación de valor clave sobre una propiedad de un controlador de vista diferente. Resulta que estaba llamando -initWithNibNamecon el nombre de plumín equivocado.
jlstrecker
Sí, esto también me ayudó ... estaba usando el UIViewController en lugar de MyCustomeViewController ... pero este es un problema de jerarquía puede ser ... la introspección falló debido al objeto de clase omitido ... Gracias de todos modos
Futur
Tuve un problema similar. Dos entradas de IBAction idénticas por accidente. No se mostró en el código, solo con el clic derecho del UIControl (un UIStepper en mi caso). Solo borrar uno lo arregló.
Dave Hubbard
30

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

Comandante
fuente
Esto resuelve mi problema. tsk2x casi 3 días de dolor de cabeza.
user3818576
55
Proporciona una respuesta a la pregunta. Algo se estropeó en Nib y hacer una limpieza lo resolvió. Leí e intenté todo lo anterior en vano y luego hice la limpieza, y después de 1 hora de intentar solucionarlo, la solución de Maj lo solucionó. Me hubiera encantado ver qué en el XML podría haber causado esto, pero seguí adelante.
LevinsonTechnologies
De hecho, esto resuelve el problema: probé numerosas sugerencias anteriores y solo el proyecto limpio solucionó este error que de repente comenzó a ocurrir. Ugg ...
DustinB
Esto solucionó mi problema, probé muchas de las sugerencias anteriores. ¡Parece extraño!
Naveen Shan
23

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:

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 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:

    [self presentViewController:deviceViewController animated:YES completion:nil];
Yannis
fuente
GRACIAS por todos los pasos allí, estaba usando Xcode 5 y realmente no sabía cómo agregar manualmente una punta, ya que solo puede agregar storyboard por defecto ... Recibí algunas instrucciones pero no tan detalladas como las suyas. Realmente ayudó!
Pittfall
"Hice esto erróneamente ..." gracias, no es la primera vez que gasto mucho por este error realmente estúpido
tontonCD
23

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.

Ilansky Naftali
fuente
¡Gracias! Soy un n00b en Xcode y me llevó un tiempo encontrar los enlaces corruptos. En Xcode 9.2, puede hacer clic con el botón derecho en el elemento en la vista del guión gráfico y marcar "Salidas de referencia".
kunigami
21

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

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 es compatible con la codificación del valor de la clave [xxx].

La solución es eliminar la propiedad anterior.

ingrese la descripción de la imagen aquí

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

Suragch
fuente
Vine tan a menudo en esta página ... ¡Esta vez, esta solución lo logró! Pero, por extraño que parezca, la antigua propiedad para eliminar estaba realmente en otro ViewController que el que se bloquea, no tengo idea de por qué.
Cinn
15

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:

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 crearla mediante programación puede ser esta:

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

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.

ercu
fuente
votando ya que fue así en mi caso. Estoy usando Swift y Storyboards. Cuando creé un nuevo objetivo de compilación (para hacer una variante de compilación), la aplicación no funcionó en la nueva variante mientras que la primera funcionó bien. La aplicación se bloqueó en un controlador de vista donde el nombre del módulo se configuró de alguna manera como módulo desde el primer objetivo, mientras que en los controladores de vista en funcionamiento era Actual - <nombre del módulo aquí> . Necesita borrar el nombre del módulo allí en este caso.
Mixaz
11

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

David Carney
fuente
9

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 NSObjecty los utilizaba setValue: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é configurarlo setValue:forKey.

Finalmente comencé a comentar todas estas setValue:forKeylíneas y descubrí que mi defaultcaso de declaración de cambio funcionó paraString? .

Finalmente descubrí que no puedes usar tipos rápidos opcionales con a setValue:forKeymenos que tengan una asignación directa a un tipo Objective-C como String?o NSNumber?. Terminé cambiando todos los CShort?tipos NSNumber?ya que eso tiene una asignación directa. En Bool?mi caso, estaba bien usarlo Boole inicializarlo false. 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:

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á conectado a Objective-C. Objective-C solo puede ver los tipos que están unidos a Objective-C:

tipos de clase que se derivan de NSObject

tipos de clase que están expuestos con @objc

Estructuras rápidas que están puenteadas

AteoPace
fuente
1
Si está intentando conectar un valor bool Swift a través de enlaces de Cocoa, debe exponerlo con la directiva @objc; de lo contrario, de hecho, obtienes este error. Esta debería ser la mejor respuesta.
jvarela
9

"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

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 que tenga el mismo problema

Muhammad Ammad
fuente
8

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

MehrozKarim
fuente
8

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.

kubilay
fuente
7

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.

Jason
fuente
7

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.

  1. Se verificó que el botón estaba conectado a la acción correcta. (Este no era el problema, pero aún así es bueno verificarlo)
  2. Verifique que el botón no tenga acciones o salidas adicionales que haya 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 segue, 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 cualquier tomacorriente adicional y asegúrese de que los pasos a la siguiente pantalla tengan identificadores únicos.

Salud,

Ronaldoh1
fuente
6

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:

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

Espero que esto ayude a alguien por ahí.

Mike M. Lin
fuente
6

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.

Damo
fuente
Esto funcionó al copiar y pegar una escena en el editor de Storyboard.
Mizmor
5

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

usuario123456
fuente
4

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

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
wspruijt
fuente
1
Me sucede cuando cambio el nombre de la clase del controlador de vista y olvido que el nombre de la punta también debe cambiar. Dado que el nombre de la punta es solo una cadena, no hay error de compilación.
kris
3

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.

Simétrico
fuente
Recibí este error nuevamente. Esta vez creé un nuevo controlador de vista de tabla vacío con mi clase asignada, dejando solo el que no funciona, y moví el segue a él. Esto funcionó. Luego copié lentamente cada elemento de la vista hasta que falló nuevamente. Esta vez resultó que el problema era que había asignado algunos "Atributos de tiempo de ejecución definidos por el usuario" para un selector (estaba pensando que podría usarlos para inicializar el selector para no tener que hacerlo en código, ni idea si eso es posible ) Eliminar eso solucionó el problema. Este error es realmente horrible, ¡espero que haya mejorado en una versión futura!
Simétrico
3

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.

priya
fuente