La aplicación de iPhone falla con NSUnknownKeyException setValue:forUndefinedKey:[duplicar]

StackOverflow https://stackoverflow.com/questions/46220

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy escribiendo mi primera aplicación para iPhone, por lo que no he podido descubrir mucho sobre cómo depurar.Básicamente, mi aplicación muestra una imagen y, cuando se toca, reproduce un sonido corto.Al compilar y construir el proyecto en XCode, todo se construye correctamente, pero cuando la aplicación se ejecuta en el simulador de iPhone, falla.

Obtuve el siguiente error:

Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.'

kramerImage aquí está la imagen que estoy usando como fondo.

No estoy seguro de qué significa NSUnknownKeyException o por qué la clase no cumple con la codificación de valores clave para la clave.

¿Fue útil?

Solución

(Esto no es realmente específico de iPhone; sucederá lo mismo en Cocoa normal).

NSUnknownKeyException es un error común al usar Codificación de valores clave para acceder a una clave que el objeto no tiene.

Se puede acceder directamente a las propiedades de la mayoría de los objetos Cocoa:

[@"hello world" length]    // Objective-C 1.0
@"hello world".length      // Objective-C 2.0

O mediante codificación de valores clave:

[@"hello world" valueForKey:@"length"]

Obtendría una NSUnknownKeyException si usara la siguiente línea:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]

porque NSString no tiene una propiedad (clave) llamada 'purpleMonkeyDishwasher'.

Algo en su código está intentando establecer un valor para la clave 'kramerImage' en una UIView, que (aparentemente) no admite esa clave.Si está utilizando Interface Builder, es posible que haya algo en su plumilla.

Encuentre dónde se está utilizando 'kramerImage' e intente rastrearlo desde allí.

Otros consejos

Además, cuando cambie el nombre de una vista, no olvide eliminar la referencia del propietario del archivo.También puede generar este error.

Aquí le mostramos uno en el que obtendrá este error y cómo solucionarlo.Lo recibí al cargar una punta que solo tenía un TableViewCell personalizado.Utilicé IB para construir un xib que solo tenía el propietario del archivo, el socorrista y TableViewCell.TableViewCell solo tenía 4 UILabels que coincidían con una clase con 4 IBOutlet UILabels llamada rootCell.Cambié la clase de TableViewCell para que sea rootCell.Funcionó bien hasta que hice un par de cambios y de repente obtuve setValue:forUndefinedKey:cuando estaba creando una instancia de la clase después de cargarla desde una plumilla:

    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];

    cell = [nib objectAtIndex:0];

Falló en la primera línea, cuando la punta intentaba cargarse.Después de un tiempo, noté que estaba intentando hacer coincidir las etiquetas IBOutlet con el controlador raíz, ¡NO con la clase rootCell!Ese fue mi aviso.Lo que hice mal fue cambiar sin darme cuenta el propietario del archivo a la clase rootCell.Cuando lo cambié de nuevo a NSObject, no intentó coincidir con el delegado (rootController) al cargar.Entonces, si está haciendo lo anterior, convierta el propietario del archivo en un NSObject, pero convierta UITableCell en su clase deseada.

Tuve esta situación y resulta que incluso después de encontrar todas las instancias de la variable y eliminarlas, mi aplicación aún fallaba.Esto es lo que pasó...Creé otra instancia de una variable a partir de un campo de texto de mi XIB en mi viewController.h pero me di cuenta de que ya no la necesitaba y la eliminé.Resulta que mi programa vio eso y siguió intentando usarlo en el programa, por lo que en el futuro, si esto sucede en cualquier otro lugar, simplemente ingrese a su XIB, haga clic derecho en el botón o campo de texto, etc. y elimine cualquier variable adicional no utilizada.

Tuve el mismo problema hoy.No tenía especificada la clase correcta para el controlador de vista en mi controlador de navegación.Esto sucederá a menudo si no especifica la clase correcta para sus vistas en Interface Builder.

También obtendrá problemas con el selector no válido.¡Comprueba siempre tus clases y conexiones de Interface Builder!

Así es como resolví el mío: en el Generador de interfaces, haga clic derecho en el Controlador de vista, debería haber un signo de exclamación en la salida o método de acción que falta.Encuentra y elimina todas las referencias y eso lo solucionó.

Esto sucedió porque eliminé el método de acción en el archivo .m.

Parece que lo estás haciendo

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;

Luego, después de sintetizar esa vista de imagen, cuando abre "MyFirstIphoneAppViewController.xib" en Interface Builder, está tomando una vista de imagen desde la herramienta (menú)/Biblioteca y vincula esa salida a la 'InitialkramerImage' del propietario de los archivos de "MyFirstIphoneAppViewController.xib". .Luego guardaste el proyecto.Pero después de eso puedes cambiar el nombre de la variable de salida "InitialkramerImage" a "kramerImage".Entonces, después de hacer esto

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;

y guardar el proyecto cuando lo ejecuta. No existe la salida de "InitialkramerImage" en "MyFirstIphoneAppViewController.xib".Entonces, cuando ejecute el proyecto, no habrá ninguna referencia de salida desde Imageview a 'kramerImage' y

"Para mostrar la vista, UIViewController intentará encontrar la salida en" InitialKramerImage "que no está existente".

Por lo tanto, arrojará la "NSUnknownKeyException".

Puede verificar la salida que falta abriendo el archivo NIB (.xib) y luego haciendo clic derecho en el 'propietario de los archivos' de eso.

Si ha realizado este código en otro lugar y tenía un archivo zip/comprimido, intente extraerlo nuevamente.Puede que funcione, no sé por qué, pero siento que es un problema de extracción.

o puede intentar cambiar IBOutlet a kramerImage y vincularlo nuevamente en NIB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top